Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
This commit is contained in:
Коммит
05ba712d7e
|
@ -2822,10 +2822,11 @@ L: netdev@vger.kernel.org
|
|||
S: Maintained
|
||||
F: drivers/net/ixp2000/
|
||||
|
||||
INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/ixgb/ixgbe)
|
||||
INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/igbvf/ixgb/ixgbe)
|
||||
M: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
|
||||
M: Jesse Brandeburg <jesse.brandeburg@intel.com>
|
||||
M: Bruce Allan <bruce.w.allan@intel.com>
|
||||
M: Alex Duyck <alexander.h.duyck@intel.com>
|
||||
M: PJ Waskiewicz <peter.p.waskiewicz.jr@intel.com>
|
||||
M: John Ronciak <john.ronciak@intel.com>
|
||||
L: e1000-devel@lists.sourceforge.net
|
||||
|
@ -2835,6 +2836,7 @@ F: drivers/net/e100.c
|
|||
F: drivers/net/e1000/
|
||||
F: drivers/net/e1000e/
|
||||
F: drivers/net/igb/
|
||||
F: drivers/net/igbvf/
|
||||
F: drivers/net/ixgb/
|
||||
F: drivers/net/ixgbe/
|
||||
|
||||
|
|
|
@ -276,8 +276,13 @@ struct be_adapter {
|
|||
int link_speed;
|
||||
u8 port_type;
|
||||
u8 transceiver;
|
||||
u8 generation; /* BladeEngine ASIC generation */
|
||||
};
|
||||
|
||||
/* BladeEngine Generation numbers */
|
||||
#define BE_GEN2 2
|
||||
#define BE_GEN3 3
|
||||
|
||||
extern const struct ethtool_ops be_ethtool_ops;
|
||||
|
||||
#define drvr_stats(adapter) (&adapter->stats.drvr_stats)
|
||||
|
|
|
@ -286,7 +286,7 @@ static void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, int payload_len,
|
|||
MCC_WRB_SGE_CNT_SHIFT;
|
||||
wrb->payload_length = payload_len;
|
||||
wrb->tag0 = opcode;
|
||||
be_dws_cpu_to_le(wrb, 20);
|
||||
be_dws_cpu_to_le(wrb, 8);
|
||||
}
|
||||
|
||||
/* Don't touch the hdr after it's prepared */
|
||||
|
|
|
@ -165,7 +165,8 @@ struct be_cmd_req_hdr {
|
|||
u8 domain; /* dword 0 */
|
||||
u32 timeout; /* dword 1 */
|
||||
u32 request_length; /* dword 2 */
|
||||
u32 rsvd; /* dword 3 */
|
||||
u8 version; /* dword 3 */
|
||||
u8 rsvd[3]; /* dword 3 */
|
||||
};
|
||||
|
||||
#define RESP_HDR_INFO_OPCODE_SHIFT 0 /* bits 0 - 7 */
|
||||
|
|
|
@ -2051,6 +2051,7 @@ static void be_unmap_pci_bars(struct be_adapter *adapter)
|
|||
static int be_map_pci_bars(struct be_adapter *adapter)
|
||||
{
|
||||
u8 __iomem *addr;
|
||||
int pcicfg_reg;
|
||||
|
||||
addr = ioremap_nocache(pci_resource_start(adapter->pdev, 2),
|
||||
pci_resource_len(adapter->pdev, 2));
|
||||
|
@ -2064,8 +2065,13 @@ static int be_map_pci_bars(struct be_adapter *adapter)
|
|||
goto pci_map_err;
|
||||
adapter->db = addr;
|
||||
|
||||
addr = ioremap_nocache(pci_resource_start(adapter->pdev, 1),
|
||||
pci_resource_len(adapter->pdev, 1));
|
||||
if (adapter->generation == BE_GEN2)
|
||||
pcicfg_reg = 1;
|
||||
else
|
||||
pcicfg_reg = 0;
|
||||
|
||||
addr = ioremap_nocache(pci_resource_start(adapter->pdev, pcicfg_reg),
|
||||
pci_resource_len(adapter->pdev, pcicfg_reg));
|
||||
if (addr == NULL)
|
||||
goto pci_map_err;
|
||||
adapter->pcicfg = addr;
|
||||
|
@ -2162,6 +2168,7 @@ static int be_stats_init(struct be_adapter *adapter)
|
|||
cmd->va = pci_alloc_consistent(adapter->pdev, cmd->size, &cmd->dma);
|
||||
if (cmd->va == NULL)
|
||||
return -1;
|
||||
memset(cmd->va, cmd->size, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2240,6 +2247,20 @@ static int __devinit be_probe(struct pci_dev *pdev,
|
|||
goto rel_reg;
|
||||
}
|
||||
adapter = netdev_priv(netdev);
|
||||
|
||||
switch (pdev->device) {
|
||||
case BE_DEVICE_ID1:
|
||||
case OC_DEVICE_ID1:
|
||||
adapter->generation = BE_GEN2;
|
||||
break;
|
||||
case BE_DEVICE_ID2:
|
||||
case OC_DEVICE_ID2:
|
||||
adapter->generation = BE_GEN3;
|
||||
break;
|
||||
default:
|
||||
adapter->generation = 0;
|
||||
}
|
||||
|
||||
adapter->pdev = pdev;
|
||||
pci_set_drvdata(pdev, adapter);
|
||||
adapter->netdev = netdev;
|
||||
|
|
|
@ -3650,7 +3650,7 @@ static int bond_open(struct net_device *bond_dev)
|
|||
*/
|
||||
if (bond_alb_initialize(bond, (bond->params.mode == BOND_MODE_ALB))) {
|
||||
/* something went wrong - fail the open operation */
|
||||
return -1;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
INIT_DELAYED_WORK(&bond->alb_work, bond_alb_monitor);
|
||||
|
|
|
@ -1698,18 +1698,6 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)
|
|||
rctl &= ~E1000_RCTL_SZ_4096;
|
||||
rctl |= E1000_RCTL_BSEX;
|
||||
switch (adapter->rx_buffer_len) {
|
||||
case E1000_RXBUFFER_256:
|
||||
rctl |= E1000_RCTL_SZ_256;
|
||||
rctl &= ~E1000_RCTL_BSEX;
|
||||
break;
|
||||
case E1000_RXBUFFER_512:
|
||||
rctl |= E1000_RCTL_SZ_512;
|
||||
rctl &= ~E1000_RCTL_BSEX;
|
||||
break;
|
||||
case E1000_RXBUFFER_1024:
|
||||
rctl |= E1000_RCTL_SZ_1024;
|
||||
rctl &= ~E1000_RCTL_BSEX;
|
||||
break;
|
||||
case E1000_RXBUFFER_2048:
|
||||
default:
|
||||
rctl |= E1000_RCTL_SZ_2048;
|
||||
|
@ -3176,13 +3164,7 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
|
|||
* however with the new *_jumbo_rx* routines, jumbo receives will use
|
||||
* fragmented skbs */
|
||||
|
||||
if (max_frame <= E1000_RXBUFFER_256)
|
||||
adapter->rx_buffer_len = E1000_RXBUFFER_256;
|
||||
else if (max_frame <= E1000_RXBUFFER_512)
|
||||
adapter->rx_buffer_len = E1000_RXBUFFER_512;
|
||||
else if (max_frame <= E1000_RXBUFFER_1024)
|
||||
adapter->rx_buffer_len = E1000_RXBUFFER_1024;
|
||||
else if (max_frame <= E1000_RXBUFFER_2048)
|
||||
if (max_frame <= E1000_RXBUFFER_2048)
|
||||
adapter->rx_buffer_len = E1000_RXBUFFER_2048;
|
||||
else
|
||||
#if (PAGE_SIZE >= E1000_RXBUFFER_16384)
|
||||
|
|
|
@ -2350,18 +2350,6 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)
|
|||
rctl &= ~E1000_RCTL_SZ_4096;
|
||||
rctl |= E1000_RCTL_BSEX;
|
||||
switch (adapter->rx_buffer_len) {
|
||||
case 256:
|
||||
rctl |= E1000_RCTL_SZ_256;
|
||||
rctl &= ~E1000_RCTL_BSEX;
|
||||
break;
|
||||
case 512:
|
||||
rctl |= E1000_RCTL_SZ_512;
|
||||
rctl &= ~E1000_RCTL_BSEX;
|
||||
break;
|
||||
case 1024:
|
||||
rctl |= E1000_RCTL_SZ_1024;
|
||||
rctl &= ~E1000_RCTL_BSEX;
|
||||
break;
|
||||
case 2048:
|
||||
default:
|
||||
rctl |= E1000_RCTL_SZ_2048;
|
||||
|
@ -3788,7 +3776,7 @@ static int e1000_tso(struct e1000_adapter *adapter,
|
|||
0, IPPROTO_TCP, 0);
|
||||
cmd_length = E1000_TXD_CMD_IP;
|
||||
ipcse = skb_transport_offset(skb) - 1;
|
||||
} else if (skb_shinfo(skb)->gso_type == SKB_GSO_TCPV6) {
|
||||
} else if (skb_is_gso_v6(skb)) {
|
||||
ipv6_hdr(skb)->payload_len = 0;
|
||||
tcp_hdr(skb)->check = ~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
|
||||
&ipv6_hdr(skb)->daddr,
|
||||
|
@ -4324,13 +4312,7 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
|
|||
* fragmented skbs
|
||||
*/
|
||||
|
||||
if (max_frame <= 256)
|
||||
adapter->rx_buffer_len = 256;
|
||||
else if (max_frame <= 512)
|
||||
adapter->rx_buffer_len = 512;
|
||||
else if (max_frame <= 1024)
|
||||
adapter->rx_buffer_len = 1024;
|
||||
else if (max_frame <= 2048)
|
||||
if (max_frame <= 2048)
|
||||
adapter->rx_buffer_len = 2048;
|
||||
else
|
||||
adapter->rx_buffer_len = 4096;
|
||||
|
|
|
@ -3423,7 +3423,7 @@ static inline int igb_tso_adv(struct igb_ring *tx_ring,
|
|||
iph->daddr, 0,
|
||||
IPPROTO_TCP,
|
||||
0);
|
||||
} else if (skb_shinfo(skb)->gso_type == SKB_GSO_TCPV6) {
|
||||
} else if (skb_is_gso_v6(skb)) {
|
||||
ipv6_hdr(skb)->payload_len = 0;
|
||||
tcp_hdr(skb)->check = ~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
|
||||
&ipv6_hdr(skb)->daddr,
|
||||
|
@ -3585,6 +3585,7 @@ static inline int igb_tx_map_adv(struct igb_ring *tx_ring, struct sk_buff *skb,
|
|||
for (f = 0; f < skb_shinfo(skb)->nr_frags; f++) {
|
||||
struct skb_frag_struct *frag;
|
||||
|
||||
count++;
|
||||
i++;
|
||||
if (i == tx_ring->count)
|
||||
i = 0;
|
||||
|
@ -3606,7 +3607,6 @@ static inline int igb_tx_map_adv(struct igb_ring *tx_ring, struct sk_buff *skb,
|
|||
if (pci_dma_mapping_error(pdev, buffer_info->dma))
|
||||
goto dma_error;
|
||||
|
||||
count++;
|
||||
}
|
||||
|
||||
tx_ring->buffer_info[i].skb = skb;
|
||||
|
|
|
@ -1963,7 +1963,7 @@ static int igbvf_tso(struct igbvf_adapter *adapter,
|
|||
iph->daddr, 0,
|
||||
IPPROTO_TCP,
|
||||
0);
|
||||
} else if (skb_shinfo(skb)->gso_type == SKB_GSO_TCPV6) {
|
||||
} else if (skb_is_gso_v6(skb)) {
|
||||
ipv6_hdr(skb)->payload_len = 0;
|
||||
tcp_hdr(skb)->check = ~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
|
||||
&ipv6_hdr(skb)->daddr,
|
||||
|
@ -2117,6 +2117,7 @@ static inline int igbvf_tx_map_adv(struct igbvf_adapter *adapter,
|
|||
/* set time_stamp *before* dma to help avoid a possible race */
|
||||
buffer_info->time_stamp = jiffies;
|
||||
buffer_info->next_to_watch = i;
|
||||
buffer_info->mapped_as_page = false;
|
||||
buffer_info->dma = pci_map_single(pdev, skb->data, len,
|
||||
PCI_DMA_TODEVICE);
|
||||
if (pci_dma_mapping_error(pdev, buffer_info->dma))
|
||||
|
@ -2126,6 +2127,7 @@ static inline int igbvf_tx_map_adv(struct igbvf_adapter *adapter,
|
|||
for (f = 0; f < skb_shinfo(skb)->nr_frags; f++) {
|
||||
struct skb_frag_struct *frag;
|
||||
|
||||
count++;
|
||||
i++;
|
||||
if (i == tx_ring->count)
|
||||
i = 0;
|
||||
|
@ -2146,7 +2148,6 @@ static inline int igbvf_tx_map_adv(struct igbvf_adapter *adapter,
|
|||
PCI_DMA_TODEVICE);
|
||||
if (pci_dma_mapping_error(pdev, buffer_info->dma))
|
||||
goto dma_error;
|
||||
count++;
|
||||
}
|
||||
|
||||
tx_ring->buffer_info[i].skb = skb;
|
||||
|
|
|
@ -223,7 +223,7 @@ static void ixgbe_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id,
|
|||
|
||||
if (adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] !=
|
||||
adapter->dcb_cfg.bw_percentage[0][bwg_id]) {
|
||||
adapter->dcb_set_bitmap |= BIT_PG_RX;
|
||||
adapter->dcb_set_bitmap |= BIT_PG_TX;
|
||||
adapter->dcb_set_bitmap |= BIT_RESETLINK;
|
||||
}
|
||||
}
|
||||
|
@ -341,6 +341,12 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
|||
if (!adapter->dcb_set_bitmap)
|
||||
return DCB_NO_HW_CHG;
|
||||
|
||||
ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg,
|
||||
adapter->ring_feature[RING_F_DCB].indices);
|
||||
|
||||
if (ret)
|
||||
return DCB_NO_HW_CHG;
|
||||
|
||||
/*
|
||||
* Only take down the adapter if the configuration change
|
||||
* requires a reset.
|
||||
|
@ -359,14 +365,6 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
|||
}
|
||||
}
|
||||
|
||||
ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg,
|
||||
adapter->ring_feature[RING_F_DCB].indices);
|
||||
if (ret) {
|
||||
if (adapter->dcb_set_bitmap & BIT_RESETLINK)
|
||||
clear_bit(__IXGBE_RESETTING, &adapter->state);
|
||||
return DCB_NO_HW_CHG;
|
||||
}
|
||||
|
||||
if (adapter->dcb_cfg.pfc_mode_enable) {
|
||||
if ((adapter->hw.mac.type != ixgbe_mac_82598EB) &&
|
||||
(adapter->hw.fc.current_mode != ixgbe_fc_pfc))
|
||||
|
|
|
@ -5133,7 +5133,7 @@ static int ixgbe_tso(struct ixgbe_adapter *adapter,
|
|||
iph->daddr, 0,
|
||||
IPPROTO_TCP,
|
||||
0);
|
||||
} else if (skb_shinfo(skb)->gso_type == SKB_GSO_TCPV6) {
|
||||
} else if (skb_is_gso_v6(skb)) {
|
||||
ipv6_hdr(skb)->payload_len = 0;
|
||||
tcp_hdr(skb)->check =
|
||||
~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
|
||||
|
|
|
@ -854,8 +854,8 @@ static void ks_update_link_status(struct net_device *netdev, struct ks_net *ks)
|
|||
|
||||
static irqreturn_t ks_irq(int irq, void *pw)
|
||||
{
|
||||
struct ks_net *ks = pw;
|
||||
struct net_device *netdev = ks->netdev;
|
||||
struct net_device *netdev = pw;
|
||||
struct ks_net *ks = netdev_priv(netdev);
|
||||
u16 status;
|
||||
|
||||
/*this should be the first in IRQ handler */
|
||||
|
|
|
@ -717,6 +717,7 @@ static struct pcmcia_device_id fmvj18x_ids[] = {
|
|||
PCMCIA_PFC_DEVICE_PROD_ID12(0, "NEC", "PK-UG-J001" ,0x18df0ba0 ,0x831b1064),
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0x0d0a),
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0x0e0a),
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0e01),
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0a05),
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x1101),
|
||||
PCMCIA_DEVICE_NULL,
|
||||
|
|
|
@ -4437,7 +4437,7 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
|
|||
err = pcie_set_readrq(pdev, 4096);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "Set readrq failed.\n");
|
||||
goto err_out;
|
||||
goto err_out1;
|
||||
}
|
||||
|
||||
err = pci_request_regions(pdev, DRV_NAME);
|
||||
|
@ -4458,7 +4458,7 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
|
|||
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "No usable DMA configuration.\n");
|
||||
goto err_out;
|
||||
goto err_out2;
|
||||
}
|
||||
|
||||
/* Set PCIe reset type for EEH to fundamental. */
|
||||
|
@ -4470,7 +4470,7 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
|
|||
if (!qdev->reg_base) {
|
||||
dev_err(&pdev->dev, "Register mapping failed.\n");
|
||||
err = -ENOMEM;
|
||||
goto err_out;
|
||||
goto err_out2;
|
||||
}
|
||||
|
||||
qdev->doorbell_area_size = pci_resource_len(pdev, 3);
|
||||
|
@ -4480,14 +4480,14 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
|
|||
if (!qdev->doorbell_area) {
|
||||
dev_err(&pdev->dev, "Doorbell register mapping failed.\n");
|
||||
err = -ENOMEM;
|
||||
goto err_out;
|
||||
goto err_out2;
|
||||
}
|
||||
|
||||
err = ql_get_board_info(qdev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "Register access failed.\n");
|
||||
err = -EIO;
|
||||
goto err_out;
|
||||
goto err_out2;
|
||||
}
|
||||
qdev->msg_enable = netif_msg_init(debug, default_msg);
|
||||
spin_lock_init(&qdev->hw_lock);
|
||||
|
@ -4508,7 +4508,7 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
|
|||
err = qdev->nic_ops->get_flash(qdev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "Invalid FLASH.\n");
|
||||
goto err_out;
|
||||
goto err_out2;
|
||||
}
|
||||
|
||||
memcpy(ndev->perm_addr, ndev->dev_addr, ndev->addr_len);
|
||||
|
@ -4542,8 +4542,9 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
|
|||
DRV_NAME, DRV_VERSION);
|
||||
}
|
||||
return 0;
|
||||
err_out:
|
||||
err_out2:
|
||||
ql_release_all(pdev);
|
||||
err_out1:
|
||||
pci_disable_device(pdev);
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -804,7 +804,7 @@ int efx_mcdi_nvram_read(struct efx_nic *efx, unsigned int type,
|
|||
loff_t offset, u8 *buffer, size_t length)
|
||||
{
|
||||
u8 inbuf[MC_CMD_NVRAM_READ_IN_LEN];
|
||||
u8 outbuf[MC_CMD_NVRAM_READ_OUT_LEN(length)];
|
||||
u8 outbuf[MC_CMD_NVRAM_READ_OUT_LEN(EFX_MCDI_NVRAM_LEN_MAX)];
|
||||
size_t outlen;
|
||||
int rc;
|
||||
|
||||
|
@ -828,7 +828,7 @@ fail:
|
|||
int efx_mcdi_nvram_write(struct efx_nic *efx, unsigned int type,
|
||||
loff_t offset, const u8 *buffer, size_t length)
|
||||
{
|
||||
u8 inbuf[MC_CMD_NVRAM_WRITE_IN_LEN(length)];
|
||||
u8 inbuf[MC_CMD_NVRAM_WRITE_IN_LEN(EFX_MCDI_NVRAM_LEN_MAX)];
|
||||
int rc;
|
||||
|
||||
MCDI_SET_DWORD(inbuf, NVRAM_WRITE_IN_TYPE, type);
|
||||
|
@ -838,7 +838,8 @@ int efx_mcdi_nvram_write(struct efx_nic *efx, unsigned int type,
|
|||
|
||||
BUILD_BUG_ON(MC_CMD_NVRAM_WRITE_OUT_LEN != 0);
|
||||
|
||||
rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_WRITE, inbuf, sizeof(inbuf),
|
||||
rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_WRITE, inbuf,
|
||||
ALIGN(MC_CMD_NVRAM_WRITE_IN_LEN(length), 4),
|
||||
NULL, 0, NULL);
|
||||
if (rc)
|
||||
goto fail;
|
||||
|
|
|
@ -111,6 +111,7 @@ extern int efx_mcdi_nvram_read(struct efx_nic *efx, unsigned int type,
|
|||
extern int efx_mcdi_nvram_write(struct efx_nic *efx, unsigned int type,
|
||||
loff_t offset, const u8 *buffer,
|
||||
size_t length);
|
||||
#define EFX_MCDI_NVRAM_LEN_MAX 128
|
||||
extern int efx_mcdi_nvram_erase(struct efx_nic *efx, unsigned int type,
|
||||
loff_t offset, size_t length);
|
||||
extern int efx_mcdi_nvram_update_finish(struct efx_nic *efx,
|
||||
|
|
|
@ -1090,8 +1090,10 @@
|
|||
#define MC_CMD_MAC_RX_LANES01_DISP_ERR 57
|
||||
#define MC_CMD_MAC_RX_LANES23_DISP_ERR 58
|
||||
#define MC_CMD_MAC_RX_MATCH_FAULT 59
|
||||
#define MC_CMD_GMAC_DMABUF_START 64
|
||||
#define MC_CMD_GMAC_DMABUF_END 95
|
||||
/* Insert new members here. */
|
||||
#define MC_CMD_MAC_GENERATION_END 60
|
||||
#define MC_CMD_MAC_GENERATION_END 96
|
||||
#define MC_CMD_MAC_NSTATS (MC_CMD_MAC_GENERATION_END+1)
|
||||
|
||||
/* MC_CMD_MAC_STATS:
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
#include "mcdi_pcol.h"
|
||||
|
||||
#define EFX_SPI_VERIFY_BUF_LEN 16
|
||||
#define EFX_MCDI_CHUNK_LEN 128
|
||||
|
||||
struct efx_mtd_partition {
|
||||
struct mtd_info mtd;
|
||||
|
@ -428,7 +427,7 @@ static int siena_mtd_read(struct mtd_info *mtd, loff_t start,
|
|||
int rc = 0;
|
||||
|
||||
while (offset < end) {
|
||||
chunk = min_t(size_t, end - offset, EFX_MCDI_CHUNK_LEN);
|
||||
chunk = min_t(size_t, end - offset, EFX_MCDI_NVRAM_LEN_MAX);
|
||||
rc = efx_mcdi_nvram_read(efx, part->mcdi.nvram_type, offset,
|
||||
buffer, chunk);
|
||||
if (rc)
|
||||
|
@ -491,7 +490,7 @@ static int siena_mtd_write(struct mtd_info *mtd, loff_t start,
|
|||
}
|
||||
|
||||
while (offset < end) {
|
||||
chunk = min_t(size_t, end - offset, EFX_MCDI_CHUNK_LEN);
|
||||
chunk = min_t(size_t, end - offset, EFX_MCDI_NVRAM_LEN_MAX);
|
||||
rc = efx_mcdi_nvram_write(efx, part->mcdi.nvram_type, offset,
|
||||
buffer, chunk);
|
||||
if (rc)
|
||||
|
|
|
@ -644,6 +644,7 @@ static void sky2_phy_power_up(struct sky2_hw *hw, unsigned port)
|
|||
{
|
||||
u32 reg1;
|
||||
|
||||
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
|
||||
reg1 = sky2_pci_read32(hw, PCI_DEV_REG1);
|
||||
reg1 &= ~phy_power[port];
|
||||
|
||||
|
@ -651,6 +652,7 @@ static void sky2_phy_power_up(struct sky2_hw *hw, unsigned port)
|
|||
reg1 |= coma_mode[port];
|
||||
|
||||
sky2_pci_write32(hw, PCI_DEV_REG1, reg1);
|
||||
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
||||
sky2_pci_read32(hw, PCI_DEV_REG1);
|
||||
|
||||
if (hw->chip_id == CHIP_ID_YUKON_FE)
|
||||
|
@ -707,9 +709,11 @@ static void sky2_phy_power_down(struct sky2_hw *hw, unsigned port)
|
|||
gm_phy_write(hw, port, PHY_MARV_CTRL, PHY_CT_PDOWN);
|
||||
}
|
||||
|
||||
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
|
||||
reg1 = sky2_pci_read32(hw, PCI_DEV_REG1);
|
||||
reg1 |= phy_power[port]; /* set PHY to PowerDown/COMA Mode */
|
||||
sky2_pci_write32(hw, PCI_DEV_REG1, reg1);
|
||||
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
||||
}
|
||||
|
||||
/* Force a renegotiation */
|
||||
|
@ -2149,7 +2153,9 @@ static void sky2_qlink_intr(struct sky2_hw *hw)
|
|||
|
||||
/* reset PHY Link Detect */
|
||||
phy = sky2_pci_read16(hw, PSM_CONFIG_REG4);
|
||||
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
|
||||
sky2_pci_write16(hw, PSM_CONFIG_REG4, phy | 1);
|
||||
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
||||
|
||||
sky2_link_up(sky2);
|
||||
}
|
||||
|
@ -2640,6 +2646,7 @@ static void sky2_hw_intr(struct sky2_hw *hw)
|
|||
if (status & (Y2_IS_MST_ERR | Y2_IS_IRQ_STAT)) {
|
||||
u16 pci_err;
|
||||
|
||||
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
|
||||
pci_err = sky2_pci_read16(hw, PCI_STATUS);
|
||||
if (net_ratelimit())
|
||||
dev_err(&pdev->dev, "PCI hardware error (0x%x)\n",
|
||||
|
@ -2647,12 +2654,14 @@ static void sky2_hw_intr(struct sky2_hw *hw)
|
|||
|
||||
sky2_pci_write16(hw, PCI_STATUS,
|
||||
pci_err | PCI_STATUS_ERROR_BITS);
|
||||
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
||||
}
|
||||
|
||||
if (status & Y2_IS_PCI_EXP) {
|
||||
/* PCI-Express uncorrectable Error occurred */
|
||||
u32 err;
|
||||
|
||||
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
|
||||
err = sky2_read32(hw, Y2_CFG_AER + PCI_ERR_UNCOR_STATUS);
|
||||
sky2_write32(hw, Y2_CFG_AER + PCI_ERR_UNCOR_STATUS,
|
||||
0xfffffffful);
|
||||
|
@ -2660,6 +2669,7 @@ static void sky2_hw_intr(struct sky2_hw *hw)
|
|||
dev_err(&pdev->dev, "PCI Express error (0x%x)\n", err);
|
||||
|
||||
sky2_read32(hw, Y2_CFG_AER + PCI_ERR_UNCOR_STATUS);
|
||||
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
||||
}
|
||||
|
||||
if (status & Y2_HWE_L1_MASK)
|
||||
|
@ -3038,6 +3048,7 @@ static void sky2_reset(struct sky2_hw *hw)
|
|||
}
|
||||
|
||||
sky2_power_on(hw);
|
||||
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
||||
|
||||
for (i = 0; i < hw->ports; i++) {
|
||||
sky2_write8(hw, SK_REG(i, GMAC_LINK_CTRL), GMLC_RST_SET);
|
||||
|
@ -3074,6 +3085,7 @@ static void sky2_reset(struct sky2_hw *hw)
|
|||
reg <<= PSM_CONFIG_REG4_TIMER_PHY_LINK_DETECT_BASE;
|
||||
|
||||
/* reset PHY Link Detect */
|
||||
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
|
||||
sky2_pci_write16(hw, PSM_CONFIG_REG4,
|
||||
reg | PSM_CONFIG_REG4_RST_PHY_LINK_DETECT);
|
||||
sky2_pci_write16(hw, PSM_CONFIG_REG4, reg);
|
||||
|
@ -3091,6 +3103,7 @@ static void sky2_reset(struct sky2_hw *hw)
|
|||
/* restore the PCIe Link Control register */
|
||||
sky2_pci_write16(hw, cap + PCI_EXP_LNKCTL, reg);
|
||||
}
|
||||
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
||||
|
||||
/* re-enable PEX PM in PEX PHY debug reg. 8 (clear bit 12) */
|
||||
sky2_write32(hw, Y2_PEX_PHY_DATA, PEX_DB_ACCESS | (0x08UL << 16));
|
||||
|
@ -3230,6 +3243,27 @@ static inline u8 sky2_wol_supported(const struct sky2_hw *hw)
|
|||
return sky2_is_copper(hw) ? (WAKE_PHY | WAKE_MAGIC) : 0;
|
||||
}
|
||||
|
||||
static void sky2_hw_set_wol(struct sky2_hw *hw)
|
||||
{
|
||||
int wol = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < hw->ports; i++) {
|
||||
struct net_device *dev = hw->dev[i];
|
||||
struct sky2_port *sky2 = netdev_priv(dev);
|
||||
|
||||
if (sky2->wol)
|
||||
wol = 1;
|
||||
}
|
||||
|
||||
if (hw->chip_id == CHIP_ID_YUKON_EC_U ||
|
||||
hw->chip_id == CHIP_ID_YUKON_EX ||
|
||||
hw->chip_id == CHIP_ID_YUKON_FE_P)
|
||||
sky2_write32(hw, B0_CTST, wol ? Y2_HW_WOL_ON : Y2_HW_WOL_OFF);
|
||||
|
||||
device_set_wakeup_enable(&hw->pdev->dev, wol);
|
||||
}
|
||||
|
||||
static void sky2_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
||||
{
|
||||
const struct sky2_port *sky2 = netdev_priv(dev);
|
||||
|
@ -3249,13 +3283,7 @@ static int sky2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
|||
|
||||
sky2->wol = wol->wolopts;
|
||||
|
||||
if (hw->chip_id == CHIP_ID_YUKON_EC_U ||
|
||||
hw->chip_id == CHIP_ID_YUKON_EX ||
|
||||
hw->chip_id == CHIP_ID_YUKON_FE_P)
|
||||
sky2_write32(hw, B0_CTST, sky2->wol
|
||||
? Y2_HW_WOL_ON : Y2_HW_WOL_OFF);
|
||||
|
||||
device_set_wakeup_enable(&hw->pdev->dev, sky2->wol);
|
||||
sky2_hw_set_wol(hw);
|
||||
|
||||
if (!netif_running(dev))
|
||||
sky2_wol_init(sky2);
|
||||
|
|
|
@ -1063,7 +1063,7 @@ static int netdev_open(struct net_device *dev)
|
|||
if (retval) {
|
||||
printk(KERN_ERR "starfire: Failed to load firmware \"%s\"\n",
|
||||
FIRMWARE_RX);
|
||||
return retval;
|
||||
goto out_init;
|
||||
}
|
||||
if (fw_rx->size % 4) {
|
||||
printk(KERN_ERR "starfire: bogus length %zu in \"%s\"\n",
|
||||
|
@ -1108,6 +1108,9 @@ out_tx:
|
|||
release_firmware(fw_tx);
|
||||
out_rx:
|
||||
release_firmware(fw_rx);
|
||||
out_init:
|
||||
if (retval)
|
||||
netdev_close(dev);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
|
@ -249,6 +249,7 @@ static DEFINE_PCI_DEVICE_TABLE(tulip_pci_tbl) = {
|
|||
{ 0x17B3, 0xAB08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET },
|
||||
{ 0x10b7, 0x9300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, /* 3Com 3CSOHO100B-TX */
|
||||
{ 0x14ea, 0xab08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, /* Planex FNW-3602-TX */
|
||||
{ 0x1414, 0x0001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, /* Microsoft MN-120 */
|
||||
{ 0x1414, 0x0002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET },
|
||||
{ } /* terminate list */
|
||||
};
|
||||
|
|
|
@ -395,8 +395,7 @@ static void refill_work(struct work_struct *work)
|
|||
|
||||
vi = container_of(work, struct virtnet_info, refill.work);
|
||||
napi_disable(&vi->napi);
|
||||
try_fill_recv(vi, GFP_KERNEL);
|
||||
still_empty = (vi->num == 0);
|
||||
still_empty = !try_fill_recv(vi, GFP_KERNEL);
|
||||
napi_enable(&vi->napi);
|
||||
|
||||
/* In theory, this can happen: if we don't get any buffers in
|
||||
|
|
|
@ -151,6 +151,7 @@ enum {
|
|||
|
||||
/* Device IDs */
|
||||
USB_DEVICE_ID_I6050 = 0x0186,
|
||||
USB_DEVICE_ID_I6050_2 = 0x0188,
|
||||
};
|
||||
|
||||
|
||||
|
@ -234,6 +235,7 @@ struct i2400mu {
|
|||
u8 rx_size_auto_shrink;
|
||||
|
||||
struct dentry *debugfs_dentry;
|
||||
unsigned i6050:1; /* 1 if this is a 6050 based SKU */
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -478,7 +478,16 @@ int i2400mu_probe(struct usb_interface *iface,
|
|||
i2400m->bus_bm_wait_for_ack = i2400mu_bus_bm_wait_for_ack;
|
||||
i2400m->bus_bm_mac_addr_impaired = 0;
|
||||
|
||||
if (id->idProduct == USB_DEVICE_ID_I6050) {
|
||||
switch (id->idProduct) {
|
||||
case USB_DEVICE_ID_I6050:
|
||||
case USB_DEVICE_ID_I6050_2:
|
||||
i2400mu->i6050 = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (i2400mu->i6050) {
|
||||
i2400m->bus_fw_names = i2400mu_bus_fw_names_6050;
|
||||
i2400mu->endpoint_cfg.bulk_out = 0;
|
||||
i2400mu->endpoint_cfg.notification = 3;
|
||||
|
@ -719,6 +728,7 @@ int i2400mu_post_reset(struct usb_interface *iface)
|
|||
static
|
||||
struct usb_device_id i2400mu_id_table[] = {
|
||||
{ USB_DEVICE(0x8086, USB_DEVICE_ID_I6050) },
|
||||
{ USB_DEVICE(0x8086, USB_DEVICE_ID_I6050_2) },
|
||||
{ USB_DEVICE(0x8086, 0x0181) },
|
||||
{ USB_DEVICE(0x8086, 0x1403) },
|
||||
{ USB_DEVICE(0x8086, 0x1405) },
|
||||
|
|
|
@ -807,12 +807,11 @@ static void ath9k_hw_init_mode_gain_regs(struct ath_hw *ah)
|
|||
}
|
||||
}
|
||||
|
||||
static void ath9k_hw_init_11a_eeprom_fix(struct ath_hw *ah)
|
||||
static void ath9k_hw_init_eeprom_fix(struct ath_hw *ah)
|
||||
{
|
||||
u32 i, j;
|
||||
|
||||
if ((ah->hw_version.devid == AR9280_DEVID_PCI) &&
|
||||
test_bit(ATH9K_MODE_11A, ah->caps.wireless_modes)) {
|
||||
if (ah->hw_version.devid == AR9280_DEVID_PCI) {
|
||||
|
||||
/* EEPROM Fixup */
|
||||
for (i = 0; i < ah->iniModes.ia_rows; i++) {
|
||||
|
@ -932,7 +931,7 @@ int ath9k_hw_init(struct ath_hw *ah)
|
|||
if (r)
|
||||
return r;
|
||||
|
||||
ath9k_hw_init_11a_eeprom_fix(ah);
|
||||
ath9k_hw_init_eeprom_fix(ah);
|
||||
|
||||
r = ath9k_hw_init_macaddr(ah);
|
||||
if (r) {
|
||||
|
|
|
@ -1470,10 +1470,10 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw,
|
|||
(sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) {
|
||||
ath9k_ps_wakeup(sc);
|
||||
ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
|
||||
ath_beacon_return(sc, avp);
|
||||
ath9k_ps_restore(sc);
|
||||
}
|
||||
|
||||
ath_beacon_return(sc, avp);
|
||||
sc->sc_flags &= ~SC_OP_BEACONS;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) {
|
||||
|
|
|
@ -297,7 +297,7 @@ u8 iwl_add_station(struct iwl_priv *priv, const u8 *addr, bool is_ap, u8 flags,
|
|||
}
|
||||
EXPORT_SYMBOL(iwl_add_station);
|
||||
|
||||
static void iwl_sta_ucode_deactivate(struct iwl_priv *priv, const char *addr)
|
||||
static void iwl_sta_ucode_deactivate(struct iwl_priv *priv, const u8 *addr)
|
||||
{
|
||||
unsigned long flags;
|
||||
u8 sta_id = iwl_find_station(priv, addr);
|
||||
|
@ -324,7 +324,7 @@ static void iwl_remove_sta_callback(struct iwl_priv *priv,
|
|||
{
|
||||
struct iwl_rem_sta_cmd *rm_sta =
|
||||
(struct iwl_rem_sta_cmd *)cmd->cmd.payload;
|
||||
const char *addr = rm_sta->addr;
|
||||
const u8 *addr = rm_sta->addr;
|
||||
|
||||
if (pkt->hdr.flags & IWL_CMD_FAILED_MSK) {
|
||||
IWL_ERR(priv, "Bad return from REPLY_REMOVE_STA (0x%08X)\n",
|
||||
|
|
|
@ -758,6 +758,7 @@ static struct pcmcia_device_id serial_ids[] = {
|
|||
PCMCIA_PFC_DEVICE_PROD_ID12(1, "PCMCIAs", "LanModem", 0xdcfe12d3, 0xc67c648f),
|
||||
PCMCIA_PFC_DEVICE_PROD_ID12(1, "TDK", "GlobalNetworker 3410/3412", 0x1eae9475, 0xd9a93bed),
|
||||
PCMCIA_PFC_DEVICE_PROD_ID12(1, "Xircom", "CreditCard Ethernet+Modem II", 0x2e3ee845, 0xeca401bf),
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0e01),
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0a05),
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x1101),
|
||||
PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0104, 0x0070),
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include <linux/wait.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/xfrm.h>
|
||||
#include <net/dst_ops.h>
|
||||
|
||||
struct ctl_table_header;
|
||||
|
||||
|
@ -42,6 +43,11 @@ struct netns_xfrm {
|
|||
unsigned int policy_count[XFRM_POLICY_MAX * 2];
|
||||
struct work_struct policy_hash_work;
|
||||
|
||||
struct dst_ops xfrm4_dst_ops;
|
||||
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||
struct dst_ops xfrm6_dst_ops;
|
||||
#endif
|
||||
|
||||
struct sock *nlsk;
|
||||
struct sock *nlsk_stash;
|
||||
|
||||
|
|
|
@ -1367,8 +1367,8 @@ struct xfrmk_spdinfo {
|
|||
extern struct xfrm_state *xfrm_find_acq_byseq(struct net *net, u32 seq);
|
||||
extern int xfrm_state_delete(struct xfrm_state *x);
|
||||
extern int xfrm_state_flush(struct net *net, u8 proto, struct xfrm_audit *audit_info);
|
||||
extern void xfrm_sad_getinfo(struct xfrmk_sadinfo *si);
|
||||
extern void xfrm_spd_getinfo(struct xfrmk_spdinfo *si);
|
||||
extern void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si);
|
||||
extern void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si);
|
||||
extern int xfrm_replay_check(struct xfrm_state *x,
|
||||
struct sk_buff *skb, __be32 seq);
|
||||
extern void xfrm_replay_advance(struct xfrm_state *x, __be32 seq);
|
||||
|
|
|
@ -163,7 +163,7 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev,
|
|||
goto err_unlock;
|
||||
}
|
||||
|
||||
rx_stats = per_cpu_ptr(vlan_dev_info(dev)->vlan_rx_stats,
|
||||
rx_stats = per_cpu_ptr(vlan_dev_info(skb->dev)->vlan_rx_stats,
|
||||
smp_processor_id());
|
||||
rx_stats->rx_packets++;
|
||||
rx_stats->rx_bytes += skb->len;
|
||||
|
|
|
@ -39,9 +39,9 @@ static int port __read_mostly = 0;
|
|||
MODULE_PARM_DESC(port, "Port to match (0=all)");
|
||||
module_param(port, int, 0);
|
||||
|
||||
static int bufsize __read_mostly = 4096;
|
||||
static unsigned int bufsize __read_mostly = 4096;
|
||||
MODULE_PARM_DESC(bufsize, "Log buffer size in packets (4096)");
|
||||
module_param(bufsize, int, 0);
|
||||
module_param(bufsize, uint, 0);
|
||||
|
||||
static int full __read_mostly;
|
||||
MODULE_PARM_DESC(full, "Full log (1=every ack packet received, 0=only cwnd changes)");
|
||||
|
@ -75,12 +75,12 @@ static struct {
|
|||
|
||||
static inline int tcp_probe_used(void)
|
||||
{
|
||||
return (tcp_probe.head - tcp_probe.tail) % bufsize;
|
||||
return (tcp_probe.head - tcp_probe.tail) & (bufsize - 1);
|
||||
}
|
||||
|
||||
static inline int tcp_probe_avail(void)
|
||||
{
|
||||
return bufsize - tcp_probe_used();
|
||||
return bufsize - tcp_probe_used() - 1;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -116,7 +116,7 @@ static int jtcp_rcv_established(struct sock *sk, struct sk_buff *skb,
|
|||
p->ssthresh = tcp_current_ssthresh(sk);
|
||||
p->srtt = tp->srtt >> 3;
|
||||
|
||||
tcp_probe.head = (tcp_probe.head + 1) % bufsize;
|
||||
tcp_probe.head = (tcp_probe.head + 1) & (bufsize - 1);
|
||||
}
|
||||
tcp_probe.lastcwnd = tp->snd_cwnd;
|
||||
spin_unlock(&tcp_probe.lock);
|
||||
|
@ -149,7 +149,7 @@ static int tcpprobe_open(struct inode * inode, struct file * file)
|
|||
static int tcpprobe_sprint(char *tbuf, int n)
|
||||
{
|
||||
const struct tcp_log *p
|
||||
= tcp_probe.log + tcp_probe.tail % bufsize;
|
||||
= tcp_probe.log + tcp_probe.tail;
|
||||
struct timespec tv
|
||||
= ktime_to_timespec(ktime_sub(p->tstamp, tcp_probe.start));
|
||||
|
||||
|
@ -192,7 +192,7 @@ static ssize_t tcpprobe_read(struct file *file, char __user *buf,
|
|||
width = tcpprobe_sprint(tbuf, sizeof(tbuf));
|
||||
|
||||
if (cnt + width < len)
|
||||
tcp_probe.tail = (tcp_probe.tail + 1) % bufsize;
|
||||
tcp_probe.tail = (tcp_probe.tail + 1) & (bufsize - 1);
|
||||
|
||||
spin_unlock_bh(&tcp_probe.lock);
|
||||
|
||||
|
@ -222,9 +222,10 @@ static __init int tcpprobe_init(void)
|
|||
init_waitqueue_head(&tcp_probe.wait);
|
||||
spin_lock_init(&tcp_probe.lock);
|
||||
|
||||
if (bufsize < 0)
|
||||
if (bufsize == 0)
|
||||
return -EINVAL;
|
||||
|
||||
bufsize = roundup_pow_of_two(bufsize);
|
||||
tcp_probe.log = kcalloc(bufsize, sizeof(struct tcp_log), GFP_KERNEL);
|
||||
if (!tcp_probe.log)
|
||||
goto err0;
|
||||
|
@ -236,7 +237,7 @@ static __init int tcpprobe_init(void)
|
|||
if (ret)
|
||||
goto err1;
|
||||
|
||||
pr_info("TCP probe registered (port=%d)\n", port);
|
||||
pr_info("TCP probe registered (port=%d) bufsize=%u\n", port, bufsize);
|
||||
return 0;
|
||||
err1:
|
||||
proc_net_remove(&init_net, procname);
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
#include <net/xfrm.h>
|
||||
#include <net/ip.h>
|
||||
|
||||
static struct dst_ops xfrm4_dst_ops;
|
||||
static struct xfrm_policy_afinfo xfrm4_policy_afinfo;
|
||||
|
||||
static struct dst_entry *xfrm4_dst_lookup(struct net *net, int tos,
|
||||
|
@ -190,8 +189,10 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse)
|
|||
|
||||
static inline int xfrm4_garbage_collect(struct dst_ops *ops)
|
||||
{
|
||||
xfrm4_policy_afinfo.garbage_collect(&init_net);
|
||||
return (atomic_read(&xfrm4_dst_ops.entries) > xfrm4_dst_ops.gc_thresh*2);
|
||||
struct net *net = container_of(ops, struct net, xfrm.xfrm4_dst_ops);
|
||||
|
||||
xfrm4_policy_afinfo.garbage_collect(net);
|
||||
return (atomic_read(&ops->entries) > ops->gc_thresh * 2);
|
||||
}
|
||||
|
||||
static void xfrm4_update_pmtu(struct dst_entry *dst, u32 mtu)
|
||||
|
@ -268,7 +269,7 @@ static struct xfrm_policy_afinfo xfrm4_policy_afinfo = {
|
|||
static struct ctl_table xfrm4_policy_table[] = {
|
||||
{
|
||||
.procname = "xfrm4_gc_thresh",
|
||||
.data = &xfrm4_dst_ops.gc_thresh,
|
||||
.data = &init_net.xfrm.xfrm4_dst_ops.gc_thresh,
|
||||
.maxlen = sizeof(int),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
|
@ -295,8 +296,6 @@ static void __exit xfrm4_policy_fini(void)
|
|||
|
||||
void __init xfrm4_init(int rt_max_size)
|
||||
{
|
||||
xfrm4_state_init();
|
||||
xfrm4_policy_init();
|
||||
/*
|
||||
* Select a default value for the gc_thresh based on the main route
|
||||
* table hash size. It seems to me the worst case scenario is when
|
||||
|
@ -308,6 +307,9 @@ void __init xfrm4_init(int rt_max_size)
|
|||
* and start cleaning when were 1/2 full
|
||||
*/
|
||||
xfrm4_dst_ops.gc_thresh = rt_max_size/2;
|
||||
|
||||
xfrm4_state_init();
|
||||
xfrm4_policy_init();
|
||||
#ifdef CONFIG_SYSCTL
|
||||
sysctl_hdr = register_net_sysctl_table(&init_net, net_ipv4_ctl_path,
|
||||
xfrm4_policy_table);
|
||||
|
|
|
@ -63,6 +63,7 @@ struct nf_ct_frag6_queue
|
|||
struct inet_frag_queue q;
|
||||
|
||||
__be32 id; /* fragment id */
|
||||
u32 user;
|
||||
struct in6_addr saddr;
|
||||
struct in6_addr daddr;
|
||||
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#include <net/mip6.h>
|
||||
#endif
|
||||
|
||||
static struct dst_ops xfrm6_dst_ops;
|
||||
static struct xfrm_policy_afinfo xfrm6_policy_afinfo;
|
||||
|
||||
static struct dst_entry *xfrm6_dst_lookup(struct net *net, int tos,
|
||||
|
@ -224,8 +223,10 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse)
|
|||
|
||||
static inline int xfrm6_garbage_collect(struct dst_ops *ops)
|
||||
{
|
||||
xfrm6_policy_afinfo.garbage_collect(&init_net);
|
||||
return (atomic_read(&xfrm6_dst_ops.entries) > xfrm6_dst_ops.gc_thresh*2);
|
||||
struct net *net = container_of(ops, struct net, xfrm.xfrm6_dst_ops);
|
||||
|
||||
xfrm6_policy_afinfo.garbage_collect(net);
|
||||
return (atomic_read(&ops->entries) > ops->gc_thresh * 2);
|
||||
}
|
||||
|
||||
static void xfrm6_update_pmtu(struct dst_entry *dst, u32 mtu)
|
||||
|
@ -310,7 +311,7 @@ static void xfrm6_policy_fini(void)
|
|||
static struct ctl_table xfrm6_policy_table[] = {
|
||||
{
|
||||
.procname = "xfrm6_gc_thresh",
|
||||
.data = &xfrm6_dst_ops.gc_thresh,
|
||||
.data = &init_net.xfrm.xfrm6_dst_ops.gc_thresh,
|
||||
.maxlen = sizeof(int),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
|
@ -326,13 +327,6 @@ int __init xfrm6_init(void)
|
|||
int ret;
|
||||
unsigned int gc_thresh;
|
||||
|
||||
ret = xfrm6_policy_init();
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = xfrm6_state_init();
|
||||
if (ret)
|
||||
goto out_policy;
|
||||
/*
|
||||
* We need a good default value for the xfrm6 gc threshold.
|
||||
* In ipv4 we set it to the route hash table size * 8, which
|
||||
|
@ -346,6 +340,15 @@ int __init xfrm6_init(void)
|
|||
*/
|
||||
gc_thresh = FIB6_TABLE_HASHSZ * 8;
|
||||
xfrm6_dst_ops.gc_thresh = (gc_thresh < 1024) ? 1024 : gc_thresh;
|
||||
|
||||
ret = xfrm6_policy_init();
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = xfrm6_state_init();
|
||||
if (ret)
|
||||
goto out_policy;
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
sysctl_hdr = register_net_sysctl_table(&init_net, net_ipv6_ctl_path,
|
||||
xfrm6_policy_table);
|
||||
|
|
|
@ -705,7 +705,7 @@ TRACE_EVENT(drv_ampdu_action,
|
|||
__entry->ret = ret;
|
||||
__entry->action = action;
|
||||
__entry->tid = tid;
|
||||
__entry->ssn = *ssn;
|
||||
__entry->ssn = ssn ? *ssn : 0;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
|
|
|
@ -469,16 +469,16 @@ static inline int xfrm_byidx_should_resize(struct net *net, int total)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void xfrm_spd_getinfo(struct xfrmk_spdinfo *si)
|
||||
void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si)
|
||||
{
|
||||
read_lock_bh(&xfrm_policy_lock);
|
||||
si->incnt = init_net.xfrm.policy_count[XFRM_POLICY_IN];
|
||||
si->outcnt = init_net.xfrm.policy_count[XFRM_POLICY_OUT];
|
||||
si->fwdcnt = init_net.xfrm.policy_count[XFRM_POLICY_FWD];
|
||||
si->inscnt = init_net.xfrm.policy_count[XFRM_POLICY_IN+XFRM_POLICY_MAX];
|
||||
si->outscnt = init_net.xfrm.policy_count[XFRM_POLICY_OUT+XFRM_POLICY_MAX];
|
||||
si->fwdscnt = init_net.xfrm.policy_count[XFRM_POLICY_FWD+XFRM_POLICY_MAX];
|
||||
si->spdhcnt = init_net.xfrm.policy_idx_hmask;
|
||||
si->incnt = net->xfrm.policy_count[XFRM_POLICY_IN];
|
||||
si->outcnt = net->xfrm.policy_count[XFRM_POLICY_OUT];
|
||||
si->fwdcnt = net->xfrm.policy_count[XFRM_POLICY_FWD];
|
||||
si->inscnt = net->xfrm.policy_count[XFRM_POLICY_IN+XFRM_POLICY_MAX];
|
||||
si->outscnt = net->xfrm.policy_count[XFRM_POLICY_OUT+XFRM_POLICY_MAX];
|
||||
si->fwdscnt = net->xfrm.policy_count[XFRM_POLICY_FWD+XFRM_POLICY_MAX];
|
||||
si->spdhcnt = net->xfrm.policy_idx_hmask;
|
||||
si->spdhmcnt = xfrm_policy_hashmax;
|
||||
read_unlock_bh(&xfrm_policy_lock);
|
||||
}
|
||||
|
@ -1309,15 +1309,28 @@ static inline int xfrm_get_tos(struct flowi *fl, int family)
|
|||
return tos;
|
||||
}
|
||||
|
||||
static inline struct xfrm_dst *xfrm_alloc_dst(int family)
|
||||
static inline struct xfrm_dst *xfrm_alloc_dst(struct net *net, int family)
|
||||
{
|
||||
struct xfrm_policy_afinfo *afinfo = xfrm_policy_get_afinfo(family);
|
||||
struct dst_ops *dst_ops;
|
||||
struct xfrm_dst *xdst;
|
||||
|
||||
if (!afinfo)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
xdst = dst_alloc(afinfo->dst_ops) ?: ERR_PTR(-ENOBUFS);
|
||||
switch (family) {
|
||||
case AF_INET:
|
||||
dst_ops = &net->xfrm.xfrm4_dst_ops;
|
||||
break;
|
||||
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||
case AF_INET6:
|
||||
dst_ops = &net->xfrm.xfrm6_dst_ops;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
xdst = dst_alloc(dst_ops) ?: ERR_PTR(-ENOBUFS);
|
||||
|
||||
xfrm_policy_put_afinfo(afinfo);
|
||||
|
||||
|
@ -1366,6 +1379,7 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy,
|
|||
struct flowi *fl,
|
||||
struct dst_entry *dst)
|
||||
{
|
||||
struct net *net = xp_net(policy);
|
||||
unsigned long now = jiffies;
|
||||
struct net_device *dev;
|
||||
struct dst_entry *dst_prev = NULL;
|
||||
|
@ -1389,7 +1403,7 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy,
|
|||
dst_hold(dst);
|
||||
|
||||
for (; i < nx; i++) {
|
||||
struct xfrm_dst *xdst = xfrm_alloc_dst(family);
|
||||
struct xfrm_dst *xdst = xfrm_alloc_dst(net, family);
|
||||
struct dst_entry *dst1 = &xdst->u.dst;
|
||||
|
||||
err = PTR_ERR(xdst);
|
||||
|
@ -2279,6 +2293,7 @@ EXPORT_SYMBOL(xfrm_bundle_ok);
|
|||
|
||||
int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo)
|
||||
{
|
||||
struct net *net;
|
||||
int err = 0;
|
||||
if (unlikely(afinfo == NULL))
|
||||
return -EINVAL;
|
||||
|
@ -2302,6 +2317,27 @@ int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo)
|
|||
xfrm_policy_afinfo[afinfo->family] = afinfo;
|
||||
}
|
||||
write_unlock_bh(&xfrm_policy_afinfo_lock);
|
||||
|
||||
rtnl_lock();
|
||||
for_each_net(net) {
|
||||
struct dst_ops *xfrm_dst_ops;
|
||||
|
||||
switch (afinfo->family) {
|
||||
case AF_INET:
|
||||
xfrm_dst_ops = &net->xfrm.xfrm4_dst_ops;
|
||||
break;
|
||||
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||
case AF_INET6:
|
||||
xfrm_dst_ops = &net->xfrm.xfrm6_dst_ops;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
*xfrm_dst_ops = *afinfo->dst_ops;
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(xfrm_policy_register_afinfo);
|
||||
|
@ -2332,6 +2368,22 @@ int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo)
|
|||
}
|
||||
EXPORT_SYMBOL(xfrm_policy_unregister_afinfo);
|
||||
|
||||
static void __net_init xfrm_dst_ops_init(struct net *net)
|
||||
{
|
||||
struct xfrm_policy_afinfo *afinfo;
|
||||
|
||||
read_lock_bh(&xfrm_policy_afinfo_lock);
|
||||
afinfo = xfrm_policy_afinfo[AF_INET];
|
||||
if (afinfo)
|
||||
net->xfrm.xfrm4_dst_ops = *afinfo->dst_ops;
|
||||
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||
afinfo = xfrm_policy_afinfo[AF_INET6];
|
||||
if (afinfo)
|
||||
net->xfrm.xfrm6_dst_ops = *afinfo->dst_ops;
|
||||
#endif
|
||||
read_unlock_bh(&xfrm_policy_afinfo_lock);
|
||||
}
|
||||
|
||||
static struct xfrm_policy_afinfo *xfrm_policy_get_afinfo(unsigned short family)
|
||||
{
|
||||
struct xfrm_policy_afinfo *afinfo;
|
||||
|
@ -2494,6 +2546,7 @@ static int __net_init xfrm_net_init(struct net *net)
|
|||
rv = xfrm_policy_init(net);
|
||||
if (rv < 0)
|
||||
goto out_policy;
|
||||
xfrm_dst_ops_init(net);
|
||||
rv = xfrm_sysctl_init(net);
|
||||
if (rv < 0)
|
||||
goto out_sysctl;
|
||||
|
|
|
@ -641,11 +641,11 @@ out:
|
|||
}
|
||||
EXPORT_SYMBOL(xfrm_state_flush);
|
||||
|
||||
void xfrm_sad_getinfo(struct xfrmk_sadinfo *si)
|
||||
void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si)
|
||||
{
|
||||
spin_lock_bh(&xfrm_state_lock);
|
||||
si->sadcnt = init_net.xfrm.state_num;
|
||||
si->sadhcnt = init_net.xfrm.state_hmask;
|
||||
si->sadcnt = net->xfrm.state_num;
|
||||
si->sadhcnt = net->xfrm.state_hmask;
|
||||
si->sadhmcnt = xfrm_state_hashmax;
|
||||
spin_unlock_bh(&xfrm_state_lock);
|
||||
}
|
||||
|
|
|
@ -781,7 +781,8 @@ static inline size_t xfrm_spdinfo_msgsize(void)
|
|||
+ nla_total_size(sizeof(struct xfrmu_spdhinfo));
|
||||
}
|
||||
|
||||
static int build_spdinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags)
|
||||
static int build_spdinfo(struct sk_buff *skb, struct net *net,
|
||||
u32 pid, u32 seq, u32 flags)
|
||||
{
|
||||
struct xfrmk_spdinfo si;
|
||||
struct xfrmu_spdinfo spc;
|
||||
|
@ -795,7 +796,7 @@ static int build_spdinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags)
|
|||
|
||||
f = nlmsg_data(nlh);
|
||||
*f = flags;
|
||||
xfrm_spd_getinfo(&si);
|
||||
xfrm_spd_getinfo(net, &si);
|
||||
spc.incnt = si.incnt;
|
||||
spc.outcnt = si.outcnt;
|
||||
spc.fwdcnt = si.fwdcnt;
|
||||
|
@ -828,7 +829,7 @@ static int xfrm_get_spdinfo(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
if (r_skb == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
if (build_spdinfo(r_skb, spid, seq, *flags) < 0)
|
||||
if (build_spdinfo(r_skb, net, spid, seq, *flags) < 0)
|
||||
BUG();
|
||||
|
||||
return nlmsg_unicast(net->xfrm.nlsk, r_skb, spid);
|
||||
|
@ -841,7 +842,8 @@ static inline size_t xfrm_sadinfo_msgsize(void)
|
|||
+ nla_total_size(4); /* XFRMA_SAD_CNT */
|
||||
}
|
||||
|
||||
static int build_sadinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags)
|
||||
static int build_sadinfo(struct sk_buff *skb, struct net *net,
|
||||
u32 pid, u32 seq, u32 flags)
|
||||
{
|
||||
struct xfrmk_sadinfo si;
|
||||
struct xfrmu_sadhinfo sh;
|
||||
|
@ -854,7 +856,7 @@ static int build_sadinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags)
|
|||
|
||||
f = nlmsg_data(nlh);
|
||||
*f = flags;
|
||||
xfrm_sad_getinfo(&si);
|
||||
xfrm_sad_getinfo(net, &si);
|
||||
|
||||
sh.sadhmcnt = si.sadhmcnt;
|
||||
sh.sadhcnt = si.sadhcnt;
|
||||
|
@ -882,7 +884,7 @@ static int xfrm_get_sadinfo(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
if (r_skb == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
if (build_sadinfo(r_skb, spid, seq, *flags) < 0)
|
||||
if (build_sadinfo(r_skb, net, spid, seq, *flags) < 0)
|
||||
BUG();
|
||||
|
||||
return nlmsg_unicast(net->xfrm.nlsk, r_skb, spid);
|
||||
|
|
Загрузка…
Ссылка в новой задаче