mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 21:24:08 +08: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:
commit
1ce55238e2
@ -3665,6 +3665,7 @@ L: netdev@vger.kernel.org
|
||||
W: http://www.linuxfoundation.org/en/Net
|
||||
W: http://patchwork.ozlabs.org/project/netdev/list/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6.git
|
||||
S: Maintained
|
||||
F: net/
|
||||
F: include/net/
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -3916,6 +3916,8 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
/* Set PCIe reset type for EEH to fundamental. */
|
||||
pdev->needs_freset = 1;
|
||||
pci_save_state(pdev);
|
||||
qdev->reg_base =
|
||||
ioremap_nocache(pci_resource_start(pdev, 1),
|
||||
|
@ -499,7 +499,7 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp)
|
||||
/* Wait for the interrupt to come in. */
|
||||
status = ql_wait_mbx_cmd_cmplt(qdev);
|
||||
if (status)
|
||||
goto end;
|
||||
continue;
|
||||
|
||||
/* Process the event. If it's an AEN, it
|
||||
* will be handled in-line or a worker
|
||||
|
@ -174,7 +174,7 @@ config USB_NET_CDCETHER
|
||||
* Ericsson Mobile Broadband Module (all variants)
|
||||
* Motorola (DM100 and SB4100)
|
||||
* Broadcom Cable Modem (reference design)
|
||||
* Toshiba (PCX1100U and F3507g)
|
||||
* Toshiba (PCX1100U and F3507g/F3607gw)
|
||||
* ...
|
||||
|
||||
This driver creates an interface named "ethX", where X depends on
|
||||
|
@ -544,20 +544,60 @@ static const struct usb_device_id products [] = {
|
||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long) &cdc_info,
|
||||
}, {
|
||||
/* Ericsson F3307 */
|
||||
/* Ericsson F3607gw ver 2 */
|
||||
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1905, USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long) &cdc_info,
|
||||
}, {
|
||||
/* Ericsson F3607gw ver 3 */
|
||||
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1906, USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long) &cdc_info,
|
||||
}, {
|
||||
/* Ericsson F3307 */
|
||||
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x190a, USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long) &cdc_info,
|
||||
}, {
|
||||
/* Ericsson F3307 ver 2 */
|
||||
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1909, USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long) &cdc_info,
|
||||
}, {
|
||||
/* Ericsson C3607w */
|
||||
USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1049, USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long) &cdc_info,
|
||||
}, {
|
||||
/* Toshiba F3507g */
|
||||
USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130b, USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long) &cdc_info,
|
||||
}, {
|
||||
/* Toshiba F3607gw */
|
||||
USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130c, USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long) &cdc_info,
|
||||
}, {
|
||||
/* Toshiba F3607gw ver 2 */
|
||||
USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x1311, USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long) &cdc_info,
|
||||
}, {
|
||||
/* Dell F3507g */
|
||||
USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8147, USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long) &cdc_info,
|
||||
}, {
|
||||
/* Dell F3607gw */
|
||||
USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8183, USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long) &cdc_info,
|
||||
}, {
|
||||
/* Dell F3607gw ver 2 */
|
||||
USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8184, USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long) &cdc_info,
|
||||
},
|
||||
{ }, // END
|
||||
};
|
||||
|
@ -998,7 +998,7 @@ static unsigned int features[] = {
|
||||
VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN,
|
||||
};
|
||||
|
||||
static struct virtio_driver virtio_net = {
|
||||
static struct virtio_driver virtio_net_driver = {
|
||||
.feature_table = features,
|
||||
.feature_table_size = ARRAY_SIZE(features),
|
||||
.driver.name = KBUILD_MODNAME,
|
||||
@ -1011,12 +1011,12 @@ static struct virtio_driver virtio_net = {
|
||||
|
||||
static int __init init(void)
|
||||
{
|
||||
return register_virtio_driver(&virtio_net);
|
||||
return register_virtio_driver(&virtio_net_driver);
|
||||
}
|
||||
|
||||
static void __exit fini(void)
|
||||
{
|
||||
unregister_virtio_driver(&virtio_net);
|
||||
unregister_virtio_driver(&virtio_net_driver);
|
||||
}
|
||||
module_init(init);
|
||||
module_exit(fini);
|
||||
|
@ -6325,10 +6325,8 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
|
||||
|
||||
fail:
|
||||
if (dev) {
|
||||
if (registered) {
|
||||
unregister_ieee80211(priv->ieee);
|
||||
if (registered)
|
||||
unregister_netdev(dev);
|
||||
}
|
||||
|
||||
ipw2100_hw_stop_adapter(priv);
|
||||
|
||||
@ -6385,7 +6383,6 @@ static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev)
|
||||
/* Unregister the device first - this results in close()
|
||||
* being called if the device is open. If we free storage
|
||||
* first, then close() will crash. */
|
||||
unregister_ieee80211(priv->ieee);
|
||||
unregister_netdev(dev);
|
||||
|
||||
/* ipw2100_down will ensure that there is no more pending work
|
||||
|
@ -11822,7 +11822,6 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev,
|
||||
if (err) {
|
||||
IPW_ERROR("Failed to register promiscuous network "
|
||||
"device (error %d).\n", err);
|
||||
unregister_ieee80211(priv->ieee);
|
||||
unregister_netdev(priv->net_dev);
|
||||
goto out_remove_sysfs;
|
||||
}
|
||||
@ -11873,7 +11872,6 @@ static void __devexit ipw_pci_remove(struct pci_dev *pdev)
|
||||
|
||||
mutex_unlock(&priv->mutex);
|
||||
|
||||
unregister_ieee80211(priv->ieee);
|
||||
unregister_netdev(priv->net_dev);
|
||||
|
||||
if (priv->rxq) {
|
||||
|
@ -1020,7 +1020,6 @@ static inline int libipw_is_cck_rate(u8 rate)
|
||||
/* ieee80211.c */
|
||||
extern void free_ieee80211(struct net_device *dev, int monitor);
|
||||
extern struct net_device *alloc_ieee80211(int sizeof_priv, int monitor);
|
||||
extern void unregister_ieee80211(struct libipw_device *ieee);
|
||||
extern int libipw_change_mtu(struct net_device *dev, int new_mtu);
|
||||
|
||||
extern void libipw_networks_age(struct libipw_device *ieee,
|
||||
|
@ -235,19 +235,16 @@ void free_ieee80211(struct net_device *dev, int monitor)
|
||||
libipw_networks_free(ieee);
|
||||
|
||||
/* free cfg80211 resources */
|
||||
if (!monitor)
|
||||
if (!monitor) {
|
||||
wiphy_unregister(ieee->wdev.wiphy);
|
||||
kfree(ieee->a_band.channels);
|
||||
kfree(ieee->bg_band.channels);
|
||||
wiphy_free(ieee->wdev.wiphy);
|
||||
}
|
||||
|
||||
free_netdev(dev);
|
||||
}
|
||||
|
||||
void unregister_ieee80211(struct libipw_device *ieee)
|
||||
{
|
||||
wiphy_unregister(ieee->wdev.wiphy);
|
||||
kfree(ieee->a_band.channels);
|
||||
kfree(ieee->bg_band.channels);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_LIBIPW_DEBUG
|
||||
|
||||
static int debug = 0;
|
||||
@ -333,4 +330,3 @@ module_init(libipw_init);
|
||||
|
||||
EXPORT_SYMBOL(alloc_ieee80211);
|
||||
EXPORT_SYMBOL(free_ieee80211);
|
||||
EXPORT_SYMBOL(unregister_ieee80211);
|
||||
|
@ -815,6 +815,8 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
mutex_init(&rt2x00dev->csr_mutex);
|
||||
|
||||
set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
|
||||
|
||||
/*
|
||||
* Make room for rt2x00_intf inside the per-interface
|
||||
* structure ieee80211_vif.
|
||||
@ -871,8 +873,6 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00leds_register(rt2x00dev);
|
||||
rt2x00debug_register(rt2x00dev);
|
||||
|
||||
set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
|
||||
|
||||
return 0;
|
||||
|
||||
exit:
|
||||
|
@ -362,8 +362,9 @@ void rt2x00link_start_tuner(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
rt2x00link_reset_tuner(rt2x00dev, false);
|
||||
|
||||
ieee80211_queue_delayed_work(rt2x00dev->hw,
|
||||
&link->work, LINK_TUNE_INTERVAL);
|
||||
if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
|
||||
ieee80211_queue_delayed_work(rt2x00dev->hw,
|
||||
&link->work, LINK_TUNE_INTERVAL);
|
||||
}
|
||||
|
||||
void rt2x00link_stop_tuner(struct rt2x00_dev *rt2x00dev)
|
||||
@ -469,8 +470,10 @@ static void rt2x00link_tuner(struct work_struct *work)
|
||||
* Increase tuner counter, and reschedule the next link tuner run.
|
||||
*/
|
||||
link->count++;
|
||||
ieee80211_queue_delayed_work(rt2x00dev->hw,
|
||||
&link->work, LINK_TUNE_INTERVAL);
|
||||
|
||||
if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
|
||||
ieee80211_queue_delayed_work(rt2x00dev->hw,
|
||||
&link->work, LINK_TUNE_INTERVAL);
|
||||
}
|
||||
|
||||
void rt2x00link_register(struct rt2x00_dev *rt2x00dev)
|
||||
|
@ -47,6 +47,8 @@ int rt2x00usb_vendor_request(struct rt2x00_dev *rt2x00dev,
|
||||
(requesttype == USB_VENDOR_REQUEST_IN) ?
|
||||
usb_rcvctrlpipe(usb_dev, 0) : usb_sndctrlpipe(usb_dev, 0);
|
||||
|
||||
if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
|
||||
return -ENODEV;
|
||||
|
||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||
status = usb_control_msg(usb_dev, pipe, request, requesttype,
|
||||
@ -60,8 +62,10 @@ int rt2x00usb_vendor_request(struct rt2x00_dev *rt2x00dev,
|
||||
* -ENODEV: Device has disappeared, no point continuing.
|
||||
* All other errors: Try again.
|
||||
*/
|
||||
else if (status == -ENODEV)
|
||||
else if (status == -ENODEV) {
|
||||
clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ERROR(rt2x00dev,
|
||||
@ -161,6 +165,9 @@ int rt2x00usb_regbusy_read(struct rt2x00_dev *rt2x00dev,
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
|
||||
return -ENODEV;
|
||||
|
||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||
rt2x00usb_register_read_lock(rt2x00dev, offset, reg);
|
||||
if (!rt2x00_get_field32(*reg, field))
|
||||
|
@ -210,10 +210,10 @@ void rtl8187_leds_exit(struct ieee80211_hw *dev)
|
||||
|
||||
/* turn the LED off before exiting */
|
||||
ieee80211_queue_delayed_work(dev, &priv->led_off, 0);
|
||||
cancel_delayed_work_sync(&priv->led_off);
|
||||
cancel_delayed_work_sync(&priv->led_on);
|
||||
rtl8187_unregister_led(&priv->led_rx);
|
||||
rtl8187_unregister_led(&priv->led_tx);
|
||||
cancel_delayed_work_sync(&priv->led_off);
|
||||
cancel_delayed_work_sync(&priv->led_on);
|
||||
}
|
||||
#endif /* def CONFIG_RTL8187_LED */
|
||||
|
||||
|
@ -255,11 +255,9 @@ static inline bool nf_ct_kill(struct nf_conn *ct)
|
||||
}
|
||||
|
||||
/* These are for NAT. Icky. */
|
||||
/* Update TCP window tracking data when NAT mangles the packet */
|
||||
extern void nf_conntrack_tcp_update(const struct sk_buff *skb,
|
||||
unsigned int dataoff,
|
||||
struct nf_conn *ct, int dir,
|
||||
s16 offset);
|
||||
extern s16 (*nf_ct_nat_offset)(const struct nf_conn *ct,
|
||||
enum ip_conntrack_dir dir,
|
||||
u32 seq);
|
||||
|
||||
/* Fake conntrack entry for untracked connections */
|
||||
extern struct nf_conn nf_conntrack_untracked;
|
||||
|
@ -32,4 +32,8 @@ extern int (*nf_nat_seq_adjust_hook)(struct sk_buff *skb,
|
||||
* to port ct->master->saved_proto. */
|
||||
extern void nf_nat_follow_master(struct nf_conn *ct,
|
||||
struct nf_conntrack_expect *this);
|
||||
|
||||
extern s16 nf_nat_get_offset(const struct nf_conn *ct,
|
||||
enum ip_conntrack_dir dir,
|
||||
u32 seq);
|
||||
#endif
|
||||
|
@ -377,12 +377,16 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
|
||||
struct net_bridge_port *p;
|
||||
int err = 0;
|
||||
|
||||
if (dev->flags & IFF_LOOPBACK || dev->type != ARPHRD_ETHER)
|
||||
/* Don't allow bridging non-ethernet like devices */
|
||||
if ((dev->flags & IFF_LOOPBACK) ||
|
||||
dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN)
|
||||
return -EINVAL;
|
||||
|
||||
/* No bridging of bridges */
|
||||
if (dev->netdev_ops->ndo_start_xmit == br_dev_xmit)
|
||||
return -ELOOP;
|
||||
|
||||
/* Device is already being bridged */
|
||||
if (dev->br_port != NULL)
|
||||
return -EBUSY;
|
||||
|
||||
|
@ -132,23 +132,27 @@ static inline struct bcm_sock *bcm_sk(const struct sock *sk)
|
||||
/*
|
||||
* procfs functions
|
||||
*/
|
||||
static char *bcm_proc_getifname(int ifindex)
|
||||
static char *bcm_proc_getifname(char *result, int ifindex)
|
||||
{
|
||||
struct net_device *dev;
|
||||
|
||||
if (!ifindex)
|
||||
return "any";
|
||||
|
||||
/* no usage counting */
|
||||
read_lock(&dev_base_lock);
|
||||
dev = __dev_get_by_index(&init_net, ifindex);
|
||||
if (dev)
|
||||
return dev->name;
|
||||
strcpy(result, dev->name);
|
||||
else
|
||||
strcpy(result, "???");
|
||||
read_unlock(&dev_base_lock);
|
||||
|
||||
return "???";
|
||||
return result;
|
||||
}
|
||||
|
||||
static int bcm_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
char ifname[IFNAMSIZ];
|
||||
struct sock *sk = (struct sock *)m->private;
|
||||
struct bcm_sock *bo = bcm_sk(sk);
|
||||
struct bcm_op *op;
|
||||
@ -157,7 +161,7 @@ static int bcm_proc_show(struct seq_file *m, void *v)
|
||||
seq_printf(m, " / sk %p", sk);
|
||||
seq_printf(m, " / bo %p", bo);
|
||||
seq_printf(m, " / dropped %lu", bo->dropped_usr_msgs);
|
||||
seq_printf(m, " / bound %s", bcm_proc_getifname(bo->ifindex));
|
||||
seq_printf(m, " / bound %s", bcm_proc_getifname(ifname, bo->ifindex));
|
||||
seq_printf(m, " <<<\n");
|
||||
|
||||
list_for_each_entry(op, &bo->rx_ops, list) {
|
||||
@ -169,7 +173,7 @@ static int bcm_proc_show(struct seq_file *m, void *v)
|
||||
continue;
|
||||
|
||||
seq_printf(m, "rx_op: %03X %-5s ",
|
||||
op->can_id, bcm_proc_getifname(op->ifindex));
|
||||
op->can_id, bcm_proc_getifname(ifname, op->ifindex));
|
||||
seq_printf(m, "[%d]%c ", op->nframes,
|
||||
(op->flags & RX_CHECK_DLC)?'d':' ');
|
||||
if (op->kt_ival1.tv64)
|
||||
@ -194,7 +198,8 @@ static int bcm_proc_show(struct seq_file *m, void *v)
|
||||
list_for_each_entry(op, &bo->tx_ops, list) {
|
||||
|
||||
seq_printf(m, "tx_op: %03X %s [%d] ",
|
||||
op->can_id, bcm_proc_getifname(op->ifindex),
|
||||
op->can_id,
|
||||
bcm_proc_getifname(ifname, op->ifindex),
|
||||
op->nframes);
|
||||
|
||||
if (op->kt_ival1.tv64)
|
||||
|
@ -263,11 +263,10 @@ static int dn_def_dev_strategy(ctl_table *table,
|
||||
return -ENODEV;
|
||||
|
||||
rv = -ENODEV;
|
||||
if (dev->dn_ptr != NULL) {
|
||||
if (dev->dn_ptr != NULL)
|
||||
rv = dn_dev_set_default(dev, 1);
|
||||
if (rv)
|
||||
dev_put(dev);
|
||||
}
|
||||
if (rv)
|
||||
dev_put(dev);
|
||||
}
|
||||
|
||||
return rv;
|
||||
|
@ -438,25 +438,27 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
goto tx_error;
|
||||
}
|
||||
|
||||
if (tiph->frag_off)
|
||||
df |= old_iph->frag_off & htons(IP_DF);
|
||||
|
||||
if (df) {
|
||||
mtu = dst_mtu(&rt->u.dst) - sizeof(struct iphdr);
|
||||
else
|
||||
mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu;
|
||||
|
||||
if (mtu < 68) {
|
||||
stats->collisions++;
|
||||
ip_rt_put(rt);
|
||||
goto tx_error;
|
||||
}
|
||||
if (skb_dst(skb))
|
||||
skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu);
|
||||
if (mtu < 68) {
|
||||
stats->collisions++;
|
||||
ip_rt_put(rt);
|
||||
goto tx_error;
|
||||
}
|
||||
|
||||
df |= (old_iph->frag_off&htons(IP_DF));
|
||||
if (skb_dst(skb))
|
||||
skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu);
|
||||
|
||||
if ((old_iph->frag_off&htons(IP_DF)) && mtu < ntohs(old_iph->tot_len)) {
|
||||
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
|
||||
ip_rt_put(rt);
|
||||
goto tx_error;
|
||||
if ((old_iph->frag_off & htons(IP_DF)) &&
|
||||
mtu < ntohs(old_iph->tot_len)) {
|
||||
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,
|
||||
htonl(mtu));
|
||||
ip_rt_put(rt);
|
||||
goto tx_error;
|
||||
}
|
||||
}
|
||||
|
||||
if (tunnel->err_count > 0) {
|
||||
|
@ -750,6 +750,8 @@ static int __init nf_nat_init(void)
|
||||
BUG_ON(nfnetlink_parse_nat_setup_hook != NULL);
|
||||
rcu_assign_pointer(nfnetlink_parse_nat_setup_hook,
|
||||
nfnetlink_parse_nat_setup);
|
||||
BUG_ON(nf_ct_nat_offset != NULL);
|
||||
rcu_assign_pointer(nf_ct_nat_offset, nf_nat_get_offset);
|
||||
return 0;
|
||||
|
||||
cleanup_extend:
|
||||
@ -764,6 +766,7 @@ static void __exit nf_nat_cleanup(void)
|
||||
nf_ct_extend_unregister(&nat_extend);
|
||||
rcu_assign_pointer(nf_nat_seq_adjust_hook, NULL);
|
||||
rcu_assign_pointer(nfnetlink_parse_nat_setup_hook, NULL);
|
||||
rcu_assign_pointer(nf_ct_nat_offset, NULL);
|
||||
synchronize_net();
|
||||
}
|
||||
|
||||
|
@ -73,6 +73,28 @@ adjust_tcp_sequence(u32 seq,
|
||||
DUMP_OFFSET(this_way);
|
||||
}
|
||||
|
||||
/* Get the offset value, for conntrack */
|
||||
s16 nf_nat_get_offset(const struct nf_conn *ct,
|
||||
enum ip_conntrack_dir dir,
|
||||
u32 seq)
|
||||
{
|
||||
struct nf_conn_nat *nat = nfct_nat(ct);
|
||||
struct nf_nat_seq *this_way;
|
||||
s16 offset;
|
||||
|
||||
if (!nat)
|
||||
return 0;
|
||||
|
||||
this_way = &nat->seq[dir];
|
||||
spin_lock_bh(&nf_nat_seqofs_lock);
|
||||
offset = after(seq, this_way->correction_pos)
|
||||
? this_way->offset_after : this_way->offset_before;
|
||||
spin_unlock_bh(&nf_nat_seqofs_lock);
|
||||
|
||||
return offset;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nf_nat_get_offset);
|
||||
|
||||
/* Frobs data inside this packet, which is linear. */
|
||||
static void mangle_contents(struct sk_buff *skb,
|
||||
unsigned int dataoff,
|
||||
@ -189,11 +211,6 @@ nf_nat_mangle_tcp_packet(struct sk_buff *skb,
|
||||
adjust_tcp_sequence(ntohl(tcph->seq),
|
||||
(int)rep_len - (int)match_len,
|
||||
ct, ctinfo);
|
||||
/* Tell TCP window tracking about seq change */
|
||||
nf_conntrack_tcp_update(skb, ip_hdrlen(skb),
|
||||
ct, CTINFO2DIR(ctinfo),
|
||||
(int)rep_len - (int)match_len);
|
||||
|
||||
nf_conntrack_event_cache(IPCT_NATSEQADJ, ct);
|
||||
}
|
||||
return 1;
|
||||
@ -415,12 +432,7 @@ nf_nat_seq_adjust(struct sk_buff *skb,
|
||||
tcph->seq = newseq;
|
||||
tcph->ack_seq = newack;
|
||||
|
||||
if (!nf_nat_sack_adjust(skb, tcph, ct, ctinfo))
|
||||
return 0;
|
||||
|
||||
nf_conntrack_tcp_update(skb, ip_hdrlen(skb), ct, dir, seqoff);
|
||||
|
||||
return 1;
|
||||
return nf_nat_sack_adjust(skb, tcph, ct, ctinfo);
|
||||
}
|
||||
|
||||
/* Setup NAT on this expected conntrack so it follows master. */
|
||||
|
@ -1351,6 +1351,11 @@ err_stat:
|
||||
return ret;
|
||||
}
|
||||
|
||||
s16 (*nf_ct_nat_offset)(const struct nf_conn *ct,
|
||||
enum ip_conntrack_dir dir,
|
||||
u32 seq);
|
||||
EXPORT_SYMBOL_GPL(nf_ct_nat_offset);
|
||||
|
||||
int nf_conntrack_init(struct net *net)
|
||||
{
|
||||
int ret;
|
||||
@ -1368,6 +1373,9 @@ int nf_conntrack_init(struct net *net)
|
||||
/* For use by REJECT target */
|
||||
rcu_assign_pointer(ip_ct_attach, nf_conntrack_attach);
|
||||
rcu_assign_pointer(nf_ct_destroy, destroy_conntrack);
|
||||
|
||||
/* Howto get NAT offsets */
|
||||
rcu_assign_pointer(nf_ct_nat_offset, NULL);
|
||||
}
|
||||
return 0;
|
||||
|
||||
|
@ -492,6 +492,21 @@ static void tcp_sack(const struct sk_buff *skb, unsigned int dataoff,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NF_NAT_NEEDED
|
||||
static inline s16 nat_offset(const struct nf_conn *ct,
|
||||
enum ip_conntrack_dir dir,
|
||||
u32 seq)
|
||||
{
|
||||
typeof(nf_ct_nat_offset) get_offset = rcu_dereference(nf_ct_nat_offset);
|
||||
|
||||
return get_offset != NULL ? get_offset(ct, dir, seq) : 0;
|
||||
}
|
||||
#define NAT_OFFSET(pf, ct, dir, seq) \
|
||||
(pf == NFPROTO_IPV4 ? nat_offset(ct, dir, seq) : 0)
|
||||
#else
|
||||
#define NAT_OFFSET(pf, ct, dir, seq) 0
|
||||
#endif
|
||||
|
||||
static bool tcp_in_window(const struct nf_conn *ct,
|
||||
struct ip_ct_tcp *state,
|
||||
enum ip_conntrack_dir dir,
|
||||
@ -506,6 +521,7 @@ static bool tcp_in_window(const struct nf_conn *ct,
|
||||
struct ip_ct_tcp_state *receiver = &state->seen[!dir];
|
||||
const struct nf_conntrack_tuple *tuple = &ct->tuplehash[dir].tuple;
|
||||
__u32 seq, ack, sack, end, win, swin;
|
||||
s16 receiver_offset;
|
||||
bool res;
|
||||
|
||||
/*
|
||||
@ -519,11 +535,16 @@ static bool tcp_in_window(const struct nf_conn *ct,
|
||||
if (receiver->flags & IP_CT_TCP_FLAG_SACK_PERM)
|
||||
tcp_sack(skb, dataoff, tcph, &sack);
|
||||
|
||||
/* Take into account NAT sequence number mangling */
|
||||
receiver_offset = NAT_OFFSET(pf, ct, !dir, ack - 1);
|
||||
ack -= receiver_offset;
|
||||
sack -= receiver_offset;
|
||||
|
||||
pr_debug("tcp_in_window: START\n");
|
||||
pr_debug("tcp_in_window: ");
|
||||
nf_ct_dump_tuple(tuple);
|
||||
pr_debug("seq=%u ack=%u sack=%u win=%u end=%u\n",
|
||||
seq, ack, sack, win, end);
|
||||
pr_debug("seq=%u ack=%u+(%d) sack=%u+(%d) win=%u end=%u\n",
|
||||
seq, ack, receiver_offset, sack, receiver_offset, win, end);
|
||||
pr_debug("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i "
|
||||
"receiver end=%u maxend=%u maxwin=%u scale=%i\n",
|
||||
sender->td_end, sender->td_maxend, sender->td_maxwin,
|
||||
@ -613,8 +634,8 @@ static bool tcp_in_window(const struct nf_conn *ct,
|
||||
|
||||
pr_debug("tcp_in_window: ");
|
||||
nf_ct_dump_tuple(tuple);
|
||||
pr_debug("seq=%u ack=%u sack =%u win=%u end=%u\n",
|
||||
seq, ack, sack, win, end);
|
||||
pr_debug("seq=%u ack=%u+(%d) sack=%u+(%d) win=%u end=%u\n",
|
||||
seq, ack, receiver_offset, sack, receiver_offset, win, end);
|
||||
pr_debug("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i "
|
||||
"receiver end=%u maxend=%u maxwin=%u scale=%i\n",
|
||||
sender->td_end, sender->td_maxend, sender->td_maxwin,
|
||||
@ -700,7 +721,7 @@ static bool tcp_in_window(const struct nf_conn *ct,
|
||||
before(seq, sender->td_maxend + 1) ?
|
||||
after(end, sender->td_end - receiver->td_maxwin - 1) ?
|
||||
before(sack, receiver->td_end + 1) ?
|
||||
after(ack, receiver->td_end - MAXACKWINDOW(sender)) ? "BUG"
|
||||
after(sack, receiver->td_end - MAXACKWINDOW(sender) - 1) ? "BUG"
|
||||
: "ACK is under the lower bound (possible overly delayed ACK)"
|
||||
: "ACK is over the upper bound (ACKed data not seen yet)"
|
||||
: "SEQ is under the lower bound (already ACKed data retransmitted)"
|
||||
@ -715,39 +736,6 @@ static bool tcp_in_window(const struct nf_conn *ct,
|
||||
return res;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NF_NAT_NEEDED
|
||||
/* Update sender->td_end after NAT successfully mangled the packet */
|
||||
/* Caller must linearize skb at tcp header. */
|
||||
void nf_conntrack_tcp_update(const struct sk_buff *skb,
|
||||
unsigned int dataoff,
|
||||
struct nf_conn *ct, int dir,
|
||||
s16 offset)
|
||||
{
|
||||
const struct tcphdr *tcph = (const void *)skb->data + dataoff;
|
||||
const struct ip_ct_tcp_state *sender = &ct->proto.tcp.seen[dir];
|
||||
const struct ip_ct_tcp_state *receiver = &ct->proto.tcp.seen[!dir];
|
||||
__u32 end;
|
||||
|
||||
end = segment_seq_plus_len(ntohl(tcph->seq), skb->len, dataoff, tcph);
|
||||
|
||||
spin_lock_bh(&ct->lock);
|
||||
/*
|
||||
* We have to worry for the ack in the reply packet only...
|
||||
*/
|
||||
if (ct->proto.tcp.seen[dir].td_end + offset == end)
|
||||
ct->proto.tcp.seen[dir].td_end = end;
|
||||
ct->proto.tcp.last_end = end;
|
||||
spin_unlock_bh(&ct->lock);
|
||||
pr_debug("tcp_update: sender end=%u maxend=%u maxwin=%u scale=%i "
|
||||
"receiver end=%u maxend=%u maxwin=%u scale=%i\n",
|
||||
sender->td_end, sender->td_maxend, sender->td_maxwin,
|
||||
sender->td_scale,
|
||||
receiver->td_end, receiver->td_maxend, receiver->td_maxwin,
|
||||
receiver->td_scale);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nf_conntrack_tcp_update);
|
||||
#endif
|
||||
|
||||
#define TH_FIN 0x01
|
||||
#define TH_SYN 0x02
|
||||
#define TH_RST 0x04
|
||||
|
@ -103,7 +103,7 @@ static int count_them(struct xt_connlimit_data *data,
|
||||
const struct nf_conntrack_tuple *tuple,
|
||||
const union nf_inet_addr *addr,
|
||||
const union nf_inet_addr *mask,
|
||||
const struct xt_match *match)
|
||||
u_int8_t family)
|
||||
{
|
||||
const struct nf_conntrack_tuple_hash *found;
|
||||
struct xt_connlimit_conn *conn;
|
||||
@ -113,8 +113,7 @@ static int count_them(struct xt_connlimit_data *data,
|
||||
bool addit = true;
|
||||
int matches = 0;
|
||||
|
||||
|
||||
if (match->family == NFPROTO_IPV6)
|
||||
if (family == NFPROTO_IPV6)
|
||||
hash = &data->iphash[connlimit_iphash6(addr, mask)];
|
||||
else
|
||||
hash = &data->iphash[connlimit_iphash(addr->ip & mask->ip)];
|
||||
@ -157,8 +156,7 @@ static int count_them(struct xt_connlimit_data *data,
|
||||
continue;
|
||||
}
|
||||
|
||||
if (same_source_net(addr, mask, &conn->tuple.src.u3,
|
||||
match->family))
|
||||
if (same_source_net(addr, mask, &conn->tuple.src.u3, family))
|
||||
/* same source network -> be counted! */
|
||||
++matches;
|
||||
nf_ct_put(found_ct);
|
||||
@ -207,7 +205,7 @@ connlimit_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||
|
||||
spin_lock_bh(&info->data->lock);
|
||||
connections = count_them(info->data, tuple_ptr, &addr,
|
||||
&info->mask, par->match);
|
||||
&info->mask, par->family);
|
||||
spin_unlock_bh(&info->data->lock);
|
||||
|
||||
if (connections < 0) {
|
||||
|
@ -578,18 +578,18 @@ static int rose_clear_routes(void)
|
||||
|
||||
/*
|
||||
* Check that the device given is a valid AX.25 interface that is "up".
|
||||
* called whith RTNL
|
||||
*/
|
||||
static struct net_device *rose_ax25_dev_get(char *devname)
|
||||
static struct net_device *rose_ax25_dev_find(char *devname)
|
||||
{
|
||||
struct net_device *dev;
|
||||
|
||||
if ((dev = dev_get_by_name(&init_net, devname)) == NULL)
|
||||
if ((dev = __dev_get_by_name(&init_net, devname)) == NULL)
|
||||
return NULL;
|
||||
|
||||
if ((dev->flags & IFF_UP) && dev->type == ARPHRD_AX25)
|
||||
return dev;
|
||||
|
||||
dev_put(dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -720,27 +720,23 @@ int rose_rt_ioctl(unsigned int cmd, void __user *arg)
|
||||
case SIOCADDRT:
|
||||
if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct)))
|
||||
return -EFAULT;
|
||||
if ((dev = rose_ax25_dev_get(rose_route.device)) == NULL)
|
||||
if ((dev = rose_ax25_dev_find(rose_route.device)) == NULL)
|
||||
return -EINVAL;
|
||||
if (rose_dev_exists(&rose_route.address)) { /* Can't add routes to ourself */
|
||||
dev_put(dev);
|
||||
if (rose_dev_exists(&rose_route.address)) /* Can't add routes to ourself */
|
||||
return -EINVAL;
|
||||
}
|
||||
if (rose_route.mask > 10) /* Mask can't be more than 10 digits */
|
||||
return -EINVAL;
|
||||
if (rose_route.ndigis > AX25_MAX_DIGIS)
|
||||
return -EINVAL;
|
||||
err = rose_add_node(&rose_route, dev);
|
||||
dev_put(dev);
|
||||
return err;
|
||||
|
||||
case SIOCDELRT:
|
||||
if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct)))
|
||||
return -EFAULT;
|
||||
if ((dev = rose_ax25_dev_get(rose_route.device)) == NULL)
|
||||
if ((dev = rose_ax25_dev_find(rose_route.device)) == NULL)
|
||||
return -EINVAL;
|
||||
err = rose_del_node(&rose_route, dev);
|
||||
dev_put(dev);
|
||||
return err;
|
||||
|
||||
case SIOCRSCLRRT:
|
||||
|
Loading…
Reference in New Issue
Block a user