You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (34 commits) net/fsl_pq_mdio: add module license GPL can: fix WARN_ON dump in net/core/rtnetlink.c:rtmsg_ifinfo() can: should not use __dev_get_by_index() without locks hisax: remove bad udelay call to fix build error on ARM ipip: Fix handling of DF packets when pmtudisc is OFF qlge: Set PCIe reset type for EEH to fundamental. qlge: Fix early exit from mbox cmd complete wait. ixgbe: fix traffic hangs on Tx with ioatdma loaded ixgbe: Fix checking TFCS register for TXOFF status when DCB is enabled ixgbe: Fix gso_max_size for 82599 when DCB is enabled macsonic: fix crash on PowerBook 520 NET: cassini, fix lock imbalance ems_usb: Fix byte order issues on big endian machines be2net: Bug fix to send config commands to hardware after netdev_register be2net: fix to set proper flow control on resume netfilter: xt_connlimit: fix regression caused by zero family value rt2x00: Don't queue ieee80211 work after USB removal Revert "ipw2200: fix oops on missing firmware" decnet: netdevice refcount leak netfilter: nf_nat: fix NAT issue in 2.6.30.4+ ...
This commit is contained in:
@@ -959,8 +959,9 @@ static int process_idi_event (diva_strace_context_t* pLib,
|
||||
}
|
||||
if (!strncmp("State\\Layer2 No1", path, pVar->path_length)) {
|
||||
char* tmp = &pLib->lines[0].pInterface->Layer2[0];
|
||||
dword l2_state;
|
||||
diva_strace_read_uint (pVar, &l2_state);
|
||||
dword l2_state;
|
||||
if (diva_strace_read_uint(pVar, &l2_state))
|
||||
return -1;
|
||||
|
||||
switch (l2_state) {
|
||||
case 0:
|
||||
|
||||
@@ -2692,7 +2692,7 @@ static byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
|
||||
if (!(fax_control_bits & T30_CONTROL_BIT_MORE_DOCUMENTS)
|
||||
|| (fax_feature_bits & T30_FEATURE_BIT_MORE_DOCUMENTS))
|
||||
{
|
||||
len = (byte)(&(((T30_INFO *) 0)->universal_6));
|
||||
len = offsetof(T30_INFO, universal_6);
|
||||
fax_info_change = false;
|
||||
if (ncpi->length >= 4)
|
||||
{
|
||||
@@ -2754,7 +2754,7 @@ static byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
|
||||
for (i = 0; i < w; i++)
|
||||
((T30_INFO *)(plci->fax_connect_info_buffer))->station_id[i] = fax_parms[4].info[1+i];
|
||||
((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
|
||||
len = (byte)(((T30_INFO *) 0)->station_id + 20);
|
||||
len = offsetof(T30_INFO, station_id) + 20;
|
||||
w = fax_parms[5].length;
|
||||
if (w > 20)
|
||||
w = 20;
|
||||
@@ -2788,7 +2788,7 @@ static byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
|
||||
}
|
||||
else
|
||||
{
|
||||
len = (byte)(&(((T30_INFO *) 0)->universal_6));
|
||||
len = offsetof(T30_INFO, universal_6);
|
||||
}
|
||||
fax_info_change = true;
|
||||
|
||||
@@ -2892,7 +2892,7 @@ static byte connect_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
|
||||
&& (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
|
||||
&& (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
|
||||
{
|
||||
len = ((byte)(((T30_INFO *) 0)->station_id + 20));
|
||||
len = offsetof(T30_INFO, station_id) + 20;
|
||||
if (plci->fax_connect_info_length < len)
|
||||
{
|
||||
((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0;
|
||||
@@ -3802,7 +3802,7 @@ static byte manufacturer_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
|
||||
break;
|
||||
}
|
||||
ncpi = &m_parms[1];
|
||||
len = ((byte)(((T30_INFO *) 0)->station_id + 20));
|
||||
len = offsetof(T30_INFO, station_id) + 20;
|
||||
if (plci->fax_connect_info_length < len)
|
||||
{
|
||||
((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0;
|
||||
@@ -6844,7 +6844,7 @@ static void nl_ind(PLCI *plci)
|
||||
if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id-1])
|
||||
& ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD)))
|
||||
{
|
||||
i = ((word)(((T30_INFO *) 0)->station_id + 20)) + ((T30_INFO *)plci->NL.RBuffer->P)->head_line_len;
|
||||
i = offsetof(T30_INFO, station_id) + 20 + ((T30_INFO *)plci->NL.RBuffer->P)->head_line_len;
|
||||
while (i < plci->NL.RBuffer->length)
|
||||
plci->ncpi_buffer[++len] = plci->NL.RBuffer->P[i++];
|
||||
}
|
||||
@@ -7236,7 +7236,7 @@ static void nl_ind(PLCI *plci)
|
||||
{
|
||||
plci->RData[1].P = plci->RData[0].P;
|
||||
plci->RData[1].PLength = plci->RData[0].PLength;
|
||||
plci->RData[0].P = v120_header_buffer + (-((int) v120_header_buffer) & 3);
|
||||
plci->RData[0].P = v120_header_buffer + (-((unsigned long)v120_header_buffer) & 3);
|
||||
if ((plci->NL.RBuffer->P[0] & V120_HEADER_EXTEND_BIT) || (plci->NL.RLength == 1))
|
||||
plci->RData[0].PLength = 1;
|
||||
else
|
||||
@@ -8473,7 +8473,7 @@ static word add_b23(PLCI *plci, API_PARSE *bp)
|
||||
fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SEL_POLLING;
|
||||
}
|
||||
len = nlc[0];
|
||||
pos = ((byte)(((T30_INFO *) 0)->station_id + 20));
|
||||
pos = offsetof(T30_INFO, station_id) + 20;
|
||||
if (pos < plci->fax_connect_info_length)
|
||||
{
|
||||
for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
|
||||
@@ -8525,7 +8525,7 @@ static word add_b23(PLCI *plci, API_PARSE *bp)
|
||||
}
|
||||
|
||||
PUT_WORD(&(((T30_INFO *)&nlc[1])->control_bits_low), fax_control_bits);
|
||||
len = ((byte)(((T30_INFO *) 0)->station_id + 20));
|
||||
len = offsetof(T30_INFO, station_id) + 20;
|
||||
for (i = 0; i < len; i++)
|
||||
plci->fax_connect_info_buffer[i] = nlc[1+i];
|
||||
((T30_INFO *) plci->fax_connect_info_buffer)->head_line_len = 0;
|
||||
|
||||
@@ -594,6 +594,7 @@ Amd7930_l1hw(struct PStack *st, int pr, void *arg)
|
||||
if (cs->debug & L1_DEB_WARN)
|
||||
debugl1(cs, "Amd7930: l1hw: l2l1 tx_skb exist this shouldn't happen");
|
||||
skb_queue_tail(&cs->sq, skb);
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
break;
|
||||
}
|
||||
if (cs->debug & DEB_DLOG_HEX)
|
||||
|
||||
@@ -382,7 +382,7 @@ MemwaitforXFW(struct IsdnCardState *cs, int hscx)
|
||||
{
|
||||
int to = 50;
|
||||
|
||||
while ((!(MemReadHSCX(cs, hscx, HSCX_STAR) & 0x44) == 0x40) && to) {
|
||||
while (((MemReadHSCX(cs, hscx, HSCX_STAR) & 0x44) != 0x40) && to) {
|
||||
udelay(1);
|
||||
to--;
|
||||
}
|
||||
|
||||
@@ -477,62 +477,62 @@ static void
|
||||
modem_set_init(struct IsdnCardState *cs) {
|
||||
int timeout;
|
||||
|
||||
#define RCV_DELAY 20000
|
||||
#define RCV_DELAY 20
|
||||
modem_write_cmd(cs, MInit_1, strlen(MInit_1));
|
||||
timeout = 1000;
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY);
|
||||
mdelay(RCV_DELAY);
|
||||
modem_write_cmd(cs, MInit_2, strlen(MInit_2));
|
||||
timeout = 1000;
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY);
|
||||
mdelay(RCV_DELAY);
|
||||
modem_write_cmd(cs, MInit_3, strlen(MInit_3));
|
||||
timeout = 1000;
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY);
|
||||
mdelay(RCV_DELAY);
|
||||
modem_write_cmd(cs, MInit_4, strlen(MInit_4));
|
||||
timeout = 1000;
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY );
|
||||
mdelay(RCV_DELAY);
|
||||
modem_write_cmd(cs, MInit_5, strlen(MInit_5));
|
||||
timeout = 1000;
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY);
|
||||
mdelay(RCV_DELAY);
|
||||
modem_write_cmd(cs, MInit_6, strlen(MInit_6));
|
||||
timeout = 1000;
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY);
|
||||
mdelay(RCV_DELAY);
|
||||
modem_write_cmd(cs, MInit_7, strlen(MInit_7));
|
||||
timeout = 1000;
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY);
|
||||
mdelay(RCV_DELAY);
|
||||
}
|
||||
|
||||
static void
|
||||
modem_set_dial(struct IsdnCardState *cs, int outgoing) {
|
||||
int timeout;
|
||||
#define RCV_DELAY 20000
|
||||
#define RCV_DELAY 20
|
||||
|
||||
modem_write_cmd(cs, MInit_speed28800, strlen(MInit_speed28800));
|
||||
timeout = 1000;
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY);
|
||||
mdelay(RCV_DELAY);
|
||||
if (outgoing)
|
||||
modem_write_cmd(cs, MInit_dialout, strlen(MInit_dialout));
|
||||
else
|
||||
@@ -541,7 +541,7 @@ modem_set_dial(struct IsdnCardState *cs, int outgoing) {
|
||||
while(timeout-- && cs->hw.elsa.transcnt)
|
||||
udelay(1000);
|
||||
debugl1(cs, "msi tout=%d", timeout);
|
||||
udelay(RCV_DELAY);
|
||||
mdelay(RCV_DELAY);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -817,8 +817,8 @@ collect_rx_frame(usb_fifo * fifo, __u8 * data, int len, int finish)
|
||||
}
|
||||
/* we have a complete hdlc packet */
|
||||
if (finish) {
|
||||
if ((!fifo->skbuff->data[fifo->skbuff->len - 1])
|
||||
&& (fifo->skbuff->len > 3)) {
|
||||
if (fifo->skbuff->len > 3 &&
|
||||
!fifo->skbuff->data[fifo->skbuff->len - 1]) {
|
||||
|
||||
if (fifon == HFCUSB_D_RX) {
|
||||
DBG(HFCUSB_DBG_DCHANNEL,
|
||||
|
||||
@@ -32,7 +32,7 @@ waitforXFW(struct IsdnCardState *cs, int hscx)
|
||||
{
|
||||
int to = 50;
|
||||
|
||||
while ((!(READHSCX(cs, hscx, HSCX_STAR) & 0x44) == 0x40) && to) {
|
||||
while (((READHSCX(cs, hscx, HSCX_STAR) & 0x44) != 0x40) && to) {
|
||||
udelay(1);
|
||||
to--;
|
||||
}
|
||||
|
||||
@@ -468,6 +468,7 @@ ICC_l1hw(struct PStack *st, int pr, void *arg)
|
||||
if (cs->debug & L1_DEB_WARN)
|
||||
debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
|
||||
skb_queue_tail(&cs->sq, skb);
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
break;
|
||||
}
|
||||
if (cs->debug & DEB_DLOG_HEX)
|
||||
|
||||
@@ -364,7 +364,7 @@ add_layer2(struct mISDNchannel *ch, struct mISDNstack *st)
|
||||
static int
|
||||
st_own_ctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
|
||||
{
|
||||
if (!ch->st || ch->st->layer1)
|
||||
if (!ch->st || !ch->st->layer1)
|
||||
return -EINVAL;
|
||||
return ch->st->layer1->ctrl(ch->st->layer1, cmd, arg);
|
||||
}
|
||||
|
||||
@@ -259,6 +259,8 @@ struct be_adapter {
|
||||
u32 port_num;
|
||||
bool promiscuous;
|
||||
u32 cap;
|
||||
u32 rx_fc; /* Rx flow control */
|
||||
u32 tx_fc; /* Tx flow control */
|
||||
};
|
||||
|
||||
extern const struct ethtool_ops be_ethtool_ops;
|
||||
|
||||
@@ -68,7 +68,7 @@ enum {
|
||||
#define CQE_STATUS_COMPL_MASK 0xFFFF
|
||||
#define CQE_STATUS_COMPL_SHIFT 0 /* bits 0 - 15 */
|
||||
#define CQE_STATUS_EXTD_MASK 0xFFFF
|
||||
#define CQE_STATUS_EXTD_SHIFT 0 /* bits 0 - 15 */
|
||||
#define CQE_STATUS_EXTD_SHIFT 16 /* bits 16 - 31 */
|
||||
|
||||
struct be_mcc_compl {
|
||||
u32 status; /* dword 0 */
|
||||
|
||||
@@ -323,10 +323,12 @@ be_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd)
|
||||
|
||||
if (ecmd->autoneg != 0)
|
||||
return -EINVAL;
|
||||
adapter->tx_fc = ecmd->tx_pause;
|
||||
adapter->rx_fc = ecmd->rx_pause;
|
||||
|
||||
status = be_cmd_set_flow_control(adapter, ecmd->tx_pause,
|
||||
ecmd->rx_pause);
|
||||
if (!status)
|
||||
status = be_cmd_set_flow_control(adapter,
|
||||
adapter->tx_fc, adapter->rx_fc);
|
||||
if (status)
|
||||
dev_warn(&adapter->pdev->dev, "Pause param set failed.\n");
|
||||
|
||||
return status;
|
||||
|
||||
+17
-11
@@ -1610,11 +1610,21 @@ static int be_open(struct net_device *netdev)
|
||||
|
||||
status = be_cmd_link_status_query(adapter, &link_up);
|
||||
if (status)
|
||||
return status;
|
||||
goto ret_sts;
|
||||
be_link_status_update(adapter, link_up);
|
||||
|
||||
status = be_vid_config(adapter);
|
||||
if (status)
|
||||
goto ret_sts;
|
||||
|
||||
status = be_cmd_set_flow_control(adapter,
|
||||
adapter->tx_fc, adapter->rx_fc);
|
||||
if (status)
|
||||
goto ret_sts;
|
||||
|
||||
schedule_delayed_work(&adapter->work, msecs_to_jiffies(100));
|
||||
return 0;
|
||||
ret_sts:
|
||||
return status;
|
||||
}
|
||||
|
||||
static int be_setup(struct be_adapter *adapter)
|
||||
@@ -1648,17 +1658,8 @@ static int be_setup(struct be_adapter *adapter)
|
||||
if (status != 0)
|
||||
goto rx_qs_destroy;
|
||||
|
||||
status = be_vid_config(adapter);
|
||||
if (status != 0)
|
||||
goto mccqs_destroy;
|
||||
|
||||
status = be_cmd_set_flow_control(adapter, true, true);
|
||||
if (status != 0)
|
||||
goto mccqs_destroy;
|
||||
return 0;
|
||||
|
||||
mccqs_destroy:
|
||||
be_mcc_queues_destroy(adapter);
|
||||
rx_qs_destroy:
|
||||
be_rx_queues_destroy(adapter);
|
||||
tx_qs_destroy:
|
||||
@@ -1909,6 +1910,10 @@ static void be_netdev_init(struct net_device *netdev)
|
||||
|
||||
adapter->rx_csum = true;
|
||||
|
||||
/* Default settings for Rx and Tx flow control */
|
||||
adapter->rx_fc = true;
|
||||
adapter->tx_fc = true;
|
||||
|
||||
netif_set_gso_max_size(netdev, 65535);
|
||||
|
||||
BE_SET_NETDEV_OPS(netdev, &be_netdev_ops);
|
||||
@@ -2171,6 +2176,7 @@ static int be_suspend(struct pci_dev *pdev, pm_message_t state)
|
||||
be_close(netdev);
|
||||
rtnl_unlock();
|
||||
}
|
||||
be_cmd_get_flow_control(adapter, &adapter->tx_fc, &adapter->rx_fc);
|
||||
be_clear(adapter);
|
||||
|
||||
pci_save_state(pdev);
|
||||
|
||||
@@ -589,6 +589,22 @@ static int can_changelink(struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t can_get_size(const struct net_device *dev)
|
||||
{
|
||||
struct can_priv *priv = netdev_priv(dev);
|
||||
size_t size;
|
||||
|
||||
size = nla_total_size(sizeof(u32)); /* IFLA_CAN_STATE */
|
||||
size += sizeof(struct can_ctrlmode); /* IFLA_CAN_CTRLMODE */
|
||||
size += nla_total_size(sizeof(u32)); /* IFLA_CAN_RESTART_MS */
|
||||
size += sizeof(struct can_bittiming); /* IFLA_CAN_BITTIMING */
|
||||
size += sizeof(struct can_clock); /* IFLA_CAN_CLOCK */
|
||||
if (priv->bittiming_const) /* IFLA_CAN_BITTIMING_CONST */
|
||||
size += sizeof(struct can_bittiming_const);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
|
||||
{
|
||||
struct can_priv *priv = netdev_priv(dev);
|
||||
@@ -639,6 +655,7 @@ static struct rtnl_link_ops can_link_ops __read_mostly = {
|
||||
.setup = can_setup,
|
||||
.newlink = can_newlink,
|
||||
.changelink = can_changelink,
|
||||
.get_size = can_get_size,
|
||||
.fill_info = can_fill_info,
|
||||
.fill_xstats = can_fill_xstats,
|
||||
};
|
||||
|
||||
@@ -319,7 +319,7 @@ static void ems_usb_rx_can_msg(struct ems_usb *dev, struct ems_cpc_msg *msg)
|
||||
|
||||
cf = (struct can_frame *)skb_put(skb, sizeof(struct can_frame));
|
||||
|
||||
cf->can_id = msg->msg.can_msg.id;
|
||||
cf->can_id = le32_to_cpu(msg->msg.can_msg.id);
|
||||
cf->can_dlc = min_t(u8, msg->msg.can_msg.length, 8);
|
||||
|
||||
if (msg->type == CPC_MSG_TYPE_EXT_CAN_FRAME
|
||||
@@ -813,6 +813,9 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne
|
||||
msg->length = CPC_CAN_MSG_MIN_SIZE + cf->can_dlc;
|
||||
}
|
||||
|
||||
/* Respect byte order */
|
||||
msg->msg.can_msg.id = cpu_to_le32(msg->msg.can_msg.id);
|
||||
|
||||
for (i = 0; i < MAX_TX_URBS; i++) {
|
||||
if (dev->tx_contexts[i].echo_index == MAX_TX_URBS) {
|
||||
context = &dev->tx_contexts[i];
|
||||
|
||||
@@ -4342,11 +4342,11 @@ static int cas_open(struct net_device *dev)
|
||||
cas_unlock_all_restore(cp, flags);
|
||||
}
|
||||
|
||||
err = -ENOMEM;
|
||||
if (cas_tx_tiny_alloc(cp) < 0)
|
||||
return -ENOMEM;
|
||||
goto err_unlock;
|
||||
|
||||
/* alloc rx descriptors */
|
||||
err = -ENOMEM;
|
||||
if (cas_alloc_rxds(cp) < 0)
|
||||
goto err_tx_tiny;
|
||||
|
||||
@@ -4386,6 +4386,7 @@ err_spare:
|
||||
cas_free_rxds(cp);
|
||||
err_tx_tiny:
|
||||
cas_tx_tiny_free(cp);
|
||||
err_unlock:
|
||||
mutex_unlock(&cp->pm_mutex);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -2221,7 +2221,7 @@ void emac_poll_controller(struct net_device *ndev)
|
||||
struct emac_priv *priv = netdev_priv(ndev);
|
||||
|
||||
emac_int_disable(priv);
|
||||
emac_irq(ndev->irq, priv);
|
||||
emac_irq(ndev->irq, ndev);
|
||||
emac_int_enable(priv);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -427,3 +427,4 @@ void fsl_pq_mdio_exit(void)
|
||||
of_unregister_platform_driver(&fsl_pq_mdio_driver);
|
||||
}
|
||||
module_exit(fsl_pq_mdio_exit);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
|
||||
#include "ixgbe.h"
|
||||
#include "ixgbe_common.h"
|
||||
#include "ixgbe_dcb_82599.h"
|
||||
|
||||
char ixgbe_driver_name[] = "ixgbe";
|
||||
static const char ixgbe_driver_string[] =
|
||||
@@ -226,6 +227,56 @@ static void ixgbe_unmap_and_free_tx_resource(struct ixgbe_adapter *adapter,
|
||||
/* tx_buffer_info must be completely set up in the transmit path */
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_tx_is_paused - check if the tx ring is paused
|
||||
* @adapter: the ixgbe adapter
|
||||
* @tx_ring: the corresponding tx_ring
|
||||
*
|
||||
* If not in DCB mode, checks TFCS.TXOFF, otherwise, find out the
|
||||
* corresponding TC of this tx_ring when checking TFCS.
|
||||
*
|
||||
* Returns : true if paused
|
||||
*/
|
||||
static inline bool ixgbe_tx_is_paused(struct ixgbe_adapter *adapter,
|
||||
struct ixgbe_ring *tx_ring)
|
||||
{
|
||||
int tc;
|
||||
u32 txoff = IXGBE_TFCS_TXOFF;
|
||||
|
||||
#ifdef CONFIG_IXGBE_DCB
|
||||
if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
|
||||
int reg_idx = tx_ring->reg_idx;
|
||||
int dcb_i = adapter->ring_feature[RING_F_DCB].indices;
|
||||
|
||||
if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
|
||||
tc = reg_idx >> 2;
|
||||
txoff = IXGBE_TFCS_TXOFF0;
|
||||
} else if (adapter->hw.mac.type == ixgbe_mac_82599EB) {
|
||||
tc = 0;
|
||||
txoff = IXGBE_TFCS_TXOFF;
|
||||
if (dcb_i == 8) {
|
||||
/* TC0, TC1 */
|
||||
tc = reg_idx >> 5;
|
||||
if (tc == 2) /* TC2, TC3 */
|
||||
tc += (reg_idx - 64) >> 4;
|
||||
else if (tc == 3) /* TC4, TC5, TC6, TC7 */
|
||||
tc += 1 + ((reg_idx - 96) >> 3);
|
||||
} else if (dcb_i == 4) {
|
||||
/* TC0, TC1 */
|
||||
tc = reg_idx >> 6;
|
||||
if (tc == 1) {
|
||||
tc += (reg_idx - 64) >> 5;
|
||||
if (tc == 2) /* TC2, TC3 */
|
||||
tc += (reg_idx - 96) >> 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
txoff <<= tc;
|
||||
}
|
||||
#endif
|
||||
return IXGBE_READ_REG(&adapter->hw, IXGBE_TFCS) & txoff;
|
||||
}
|
||||
|
||||
static inline bool ixgbe_check_tx_hang(struct ixgbe_adapter *adapter,
|
||||
struct ixgbe_ring *tx_ring,
|
||||
unsigned int eop)
|
||||
@@ -237,7 +288,7 @@ static inline bool ixgbe_check_tx_hang(struct ixgbe_adapter *adapter,
|
||||
adapter->detect_tx_hung = false;
|
||||
if (tx_ring->tx_buffer_info[eop].time_stamp &&
|
||||
time_after(jiffies, tx_ring->tx_buffer_info[eop].time_stamp + HZ) &&
|
||||
!(IXGBE_READ_REG(&adapter->hw, IXGBE_TFCS) & IXGBE_TFCS_TXOFF)) {
|
||||
!ixgbe_tx_is_paused(adapter, tx_ring)) {
|
||||
/* detected Tx unit hang */
|
||||
union ixgbe_adv_tx_desc *tx_desc;
|
||||
tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop);
|
||||
@@ -412,19 +463,23 @@ static void ixgbe_update_tx_dca(struct ixgbe_adapter *adapter,
|
||||
u32 txctrl;
|
||||
int cpu = get_cpu();
|
||||
int q = tx_ring - adapter->tx_ring;
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
|
||||
if (tx_ring->cpu != cpu) {
|
||||
txctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_DCA_TXCTRL(q));
|
||||
if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
|
||||
txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(q));
|
||||
txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK;
|
||||
txctrl |= dca3_get_tag(&adapter->pdev->dev, cpu);
|
||||
txctrl |= IXGBE_DCA_TXCTRL_DESC_DCA_EN;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(q), txctrl);
|
||||
} else if (adapter->hw.mac.type == ixgbe_mac_82599EB) {
|
||||
txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(q));
|
||||
txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK_82599;
|
||||
txctrl |= (dca3_get_tag(&adapter->pdev->dev, cpu) <<
|
||||
IXGBE_DCA_TXCTRL_CPUID_SHIFT_82599);
|
||||
IXGBE_DCA_TXCTRL_CPUID_SHIFT_82599);
|
||||
txctrl |= IXGBE_DCA_TXCTRL_DESC_DCA_EN;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(q), txctrl);
|
||||
}
|
||||
txctrl |= IXGBE_DCA_TXCTRL_DESC_DCA_EN;
|
||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_DCA_TXCTRL(q), txctrl);
|
||||
tx_ring->cpu = cpu;
|
||||
}
|
||||
put_cpu();
|
||||
@@ -1913,11 +1968,25 @@ static void ixgbe_configure_tx(struct ixgbe_adapter *adapter)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (hw->mac.type == ixgbe_mac_82599EB) {
|
||||
u32 rttdcs;
|
||||
|
||||
/* disable the arbiter while setting MTQC */
|
||||
rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
|
||||
rttdcs |= IXGBE_RTTDCS_ARBDIS;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
|
||||
|
||||
/* We enable 8 traffic classes, DCB only */
|
||||
if (adapter->flags & IXGBE_FLAG_DCB_ENABLED)
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MTQC, (IXGBE_MTQC_RT_ENA |
|
||||
IXGBE_MTQC_8TC_8TQ));
|
||||
else
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MTQC, IXGBE_MTQC_64Q_1PB);
|
||||
|
||||
/* re-eable the arbiter */
|
||||
rttdcs &= ~IXGBE_RTTDCS_ARBDIS;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2471,7 +2540,10 @@ static void ixgbe_configure(struct ixgbe_adapter *adapter)
|
||||
ixgbe_restore_vlan(adapter);
|
||||
#ifdef CONFIG_IXGBE_DCB
|
||||
if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
|
||||
netif_set_gso_max_size(netdev, 32768);
|
||||
if (hw->mac.type == ixgbe_mac_82598EB)
|
||||
netif_set_gso_max_size(netdev, 32768);
|
||||
else
|
||||
netif_set_gso_max_size(netdev, 65536);
|
||||
ixgbe_configure_dcb(adapter);
|
||||
} else {
|
||||
netif_set_gso_max_size(netdev, 65536);
|
||||
|
||||
+60
-57
@@ -223,69 +223,73 @@ static int __devinit macsonic_init(struct net_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit mac_onboard_sonic_ethernet_addr(struct net_device *dev)
|
||||
#define INVALID_MAC(mac) (memcmp(mac, "\x08\x00\x07", 3) && \
|
||||
memcmp(mac, "\x00\xA0\x40", 3) && \
|
||||
memcmp(mac, "\x00\x80\x19", 3) && \
|
||||
memcmp(mac, "\x00\x05\x02", 3))
|
||||
|
||||
static void __devinit mac_onboard_sonic_ethernet_addr(struct net_device *dev)
|
||||
{
|
||||
struct sonic_local *lp = netdev_priv(dev);
|
||||
const int prom_addr = ONBOARD_SONIC_PROM_BASE;
|
||||
int i;
|
||||
unsigned short val;
|
||||
|
||||
/* On NuBus boards we can sometimes look in the ROM resources.
|
||||
No such luck for comm-slot/onboard. */
|
||||
for(i = 0; i < 6; i++)
|
||||
dev->dev_addr[i] = SONIC_READ_PROM(i);
|
||||
/*
|
||||
* On NuBus boards we can sometimes look in the ROM resources.
|
||||
* No such luck for comm-slot/onboard.
|
||||
* On the PowerBook 520, the PROM base address is a mystery.
|
||||
*/
|
||||
if (hwreg_present((void *)prom_addr)) {
|
||||
int i;
|
||||
|
||||
/* Most of the time, the address is bit-reversed. The NetBSD
|
||||
source has a rather long and detailed historical account of
|
||||
why this is so. */
|
||||
if (memcmp(dev->dev_addr, "\x08\x00\x07", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\xA0\x40", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\x80\x19", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\x05\x02", 3))
|
||||
bit_reverse_addr(dev->dev_addr);
|
||||
else
|
||||
return 0;
|
||||
for (i = 0; i < 6; i++)
|
||||
dev->dev_addr[i] = SONIC_READ_PROM(i);
|
||||
if (!INVALID_MAC(dev->dev_addr))
|
||||
return;
|
||||
|
||||
/* If we still have what seems to be a bogus address, we'll
|
||||
look in the CAM. The top entry should be ours. */
|
||||
/* Danger! This only works if MacOS has already initialized
|
||||
the card... */
|
||||
if (memcmp(dev->dev_addr, "\x08\x00\x07", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\xA0\x40", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\x80\x19", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\x05\x02", 3))
|
||||
{
|
||||
unsigned short val;
|
||||
|
||||
printk(KERN_INFO "macsonic: PROM seems to be wrong, trying CAM entry 15\n");
|
||||
|
||||
SONIC_WRITE(SONIC_CMD, SONIC_CR_RST);
|
||||
SONIC_WRITE(SONIC_CEP, 15);
|
||||
|
||||
val = SONIC_READ(SONIC_CAP2);
|
||||
dev->dev_addr[5] = val >> 8;
|
||||
dev->dev_addr[4] = val & 0xff;
|
||||
val = SONIC_READ(SONIC_CAP1);
|
||||
dev->dev_addr[3] = val >> 8;
|
||||
dev->dev_addr[2] = val & 0xff;
|
||||
val = SONIC_READ(SONIC_CAP0);
|
||||
dev->dev_addr[1] = val >> 8;
|
||||
dev->dev_addr[0] = val & 0xff;
|
||||
|
||||
printk(KERN_INFO "HW Address from CAM 15: %pM\n",
|
||||
dev->dev_addr);
|
||||
} else return 0;
|
||||
|
||||
if (memcmp(dev->dev_addr, "\x08\x00\x07", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\xA0\x40", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\x80\x19", 3) &&
|
||||
memcmp(dev->dev_addr, "\x00\x05\x02", 3))
|
||||
{
|
||||
/*
|
||||
* Still nonsense ... messed up someplace!
|
||||
* Most of the time, the address is bit-reversed. The NetBSD
|
||||
* source has a rather long and detailed historical account of
|
||||
* why this is so.
|
||||
*/
|
||||
printk(KERN_ERR "macsonic: ERROR (INVALID MAC)\n");
|
||||
return -EIO;
|
||||
} else return 0;
|
||||
bit_reverse_addr(dev->dev_addr);
|
||||
if (!INVALID_MAC(dev->dev_addr))
|
||||
return;
|
||||
|
||||
/*
|
||||
* If we still have what seems to be a bogus address, we'll
|
||||
* look in the CAM. The top entry should be ours.
|
||||
*/
|
||||
printk(KERN_WARNING "macsonic: MAC address in PROM seems "
|
||||
"to be invalid, trying CAM\n");
|
||||
} else {
|
||||
printk(KERN_WARNING "macsonic: cannot read MAC address from "
|
||||
"PROM, trying CAM\n");
|
||||
}
|
||||
|
||||
/* This only works if MacOS has already initialized the card. */
|
||||
|
||||
SONIC_WRITE(SONIC_CMD, SONIC_CR_RST);
|
||||
SONIC_WRITE(SONIC_CEP, 15);
|
||||
|
||||
val = SONIC_READ(SONIC_CAP2);
|
||||
dev->dev_addr[5] = val >> 8;
|
||||
dev->dev_addr[4] = val & 0xff;
|
||||
val = SONIC_READ(SONIC_CAP1);
|
||||
dev->dev_addr[3] = val >> 8;
|
||||
dev->dev_addr[2] = val & 0xff;
|
||||
val = SONIC_READ(SONIC_CAP0);
|
||||
dev->dev_addr[1] = val >> 8;
|
||||
dev->dev_addr[0] = val & 0xff;
|
||||
|
||||
if (!INVALID_MAC(dev->dev_addr))
|
||||
return;
|
||||
|
||||
/* Still nonsense ... messed up someplace! */
|
||||
|
||||
printk(KERN_WARNING "macsonic: MAC address in CAM entry 15 "
|
||||
"seems invalid, will use a random MAC\n");
|
||||
random_ether_addr(dev->dev_addr);
|
||||
}
|
||||
|
||||
static int __devinit mac_onboard_sonic_probe(struct net_device *dev)
|
||||
@@ -402,8 +406,7 @@ static int __devinit mac_onboard_sonic_probe(struct net_device *dev)
|
||||
SONIC_WRITE(SONIC_ISR, 0x7fff);
|
||||
|
||||
/* Now look for the MAC address. */
|
||||
if (mac_onboard_sonic_ethernet_addr(dev) != 0)
|
||||
return -ENODEV;
|
||||
mac_onboard_sonic_ethernet_addr(dev);
|
||||
|
||||
/* Shared init code */
|
||||
return macsonic_init(dev);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user