Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: (41 commits)
sctp: user perfect name for Delayed SACK Timer option
net: fix can_checksum_protocol() arguments swap
Revert "netlink: test for all flags of the NLM_F_DUMP composite"
gianfar: Fix misleading indentation in startup_gfar()
net/irda/sh_irda: return to RX mode when TX error
net offloading: Do not mask out NETIF_F_HW_VLAN_TX for vlan.
USB CDC NCM: tx_fixup() race condition fix
ns83820: Avoid bad pointer deref in ns83820_init_one().
ipv6: Silence privacy extensions initialization
bnx2x: Update bnx2x version to 1.62.00-4
bnx2x: Fix AER setting for BCM57712
bnx2x: Fix BCM84823 LED behavior
bnx2x: Mark full duplex on some external PHYs
bnx2x: Fix BCM8073/BCM8727 microcode loading
bnx2x: LED fix for BCM8727 over BCM57712
bnx2x: Common init will be executed only once after POR
bnx2x: Swap BCM8073 PHY polarity if required
iwlwifi: fix valid chain reading from EEPROM
ath5k: fix locking in tx_complete_poll_work
ath9k_hw: do PA offset calibration only on longcal interval
...

+507 -253
+2 -2
drivers/net/bnx2x/bnx2x.h
··· 22 22 * (you will need to reboot afterwards) */ 23 23 /* #define BNX2X_STOP_ON_ERROR */ 24 24 25 - #define DRV_MODULE_VERSION "1.62.00-3" 26 - #define DRV_MODULE_RELDATE "2010/12/21" 25 + #define DRV_MODULE_VERSION "1.62.00-4" 26 + #define DRV_MODULE_RELDATE "2011/01/18" 27 27 #define BNX2X_BC_VER 0x040200 28 28 29 29 #define BNX2X_MULTI_QUEUE
+4
drivers/net/bnx2x/bnx2x_hsi.h
··· 352 352 #define PORT_HW_CFG_LANE_SWAP_CFG_31203120 0x0000d8d8 353 353 /* forced only */ 354 354 #define PORT_HW_CFG_LANE_SWAP_CFG_32103210 0x0000e4e4 355 + /* Indicate whether to swap the external phy polarity */ 356 + #define PORT_HW_CFG_SWAP_PHY_POLARITY_MASK 0x00010000 357 + #define PORT_HW_CFG_SWAP_PHY_POLARITY_DISABLED 0x00000000 358 + #define PORT_HW_CFG_SWAP_PHY_POLARITY_ENABLED 0x00010000 355 359 356 360 u32 external_phy_config; 357 361 #define PORT_HW_CFG_SERDES_EXT_PHY_TYPE_MASK 0xff000000
+139 -34
drivers/net/bnx2x/bnx2x_link.c
··· 1573 1573 1574 1574 offset = phy->addr + ser_lane; 1575 1575 if (CHIP_IS_E2(bp)) 1576 - aer_val = 0x2800 + offset - 1; 1576 + aer_val = 0x3800 + offset - 1; 1577 1577 else 1578 1578 aer_val = 0x3800 + offset; 1579 1579 CL45_WR_OVER_CL22(bp, phy, ··· 3166 3166 if (!vars->link_up) 3167 3167 break; 3168 3168 case LED_MODE_ON: 3169 - if (SINGLE_MEDIA_DIRECT(params)) { 3169 + if (params->phy[EXT_PHY1].type == 3170 + PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727 && 3171 + CHIP_IS_E2(bp) && params->num_phys == 2) { 3172 + /** 3173 + * This is a work-around for E2+8727 Configurations 3174 + */ 3175 + if (mode == LED_MODE_ON || 3176 + speed == SPEED_10000){ 3177 + REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, 0); 3178 + REG_WR(bp, NIG_REG_LED_10G_P0 + port*4, 1); 3179 + 3180 + tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); 3181 + EMAC_WR(bp, EMAC_REG_EMAC_LED, 3182 + (tmp | EMAC_LED_OVERRIDE)); 3183 + return rc; 3184 + } 3185 + } else if (SINGLE_MEDIA_DIRECT(params)) { 3170 3186 /** 3171 3187 * This is a work-around for HW issue found when link 3172 3188 * is up in CL73 ··· 3870 3854 pause_result); 3871 3855 } 3872 3856 } 3873 - 3874 - static void bnx2x_8073_8727_external_rom_boot(struct bnx2x *bp, 3857 + static u8 bnx2x_8073_8727_external_rom_boot(struct bnx2x *bp, 3875 3858 struct bnx2x_phy *phy, 3876 3859 u8 port) 3877 3860 { 3861 + u32 count = 0; 3862 + u16 fw_ver1, fw_msgout; 3863 + u8 rc = 0; 3864 + 3878 3865 /* Boot port from external ROM */ 3879 3866 /* EDC grst */ 3880 3867 bnx2x_cl45_write(bp, phy, ··· 3907 3888 MDIO_PMA_REG_GEN_CTRL, 3908 3889 MDIO_PMA_REG_GEN_CTRL_ROM_RESET_INTERNAL_MP); 3909 3890 3910 - /* wait for 120ms for code download via SPI port */ 3911 - msleep(120); 3891 + /* Delay 100ms per the PHY specifications */ 3892 + msleep(100); 3893 + 3894 + /* 8073 sometimes taking longer to download */ 3895 + do { 3896 + count++; 3897 + if (count > 300) { 3898 + DP(NETIF_MSG_LINK, 3899 + "bnx2x_8073_8727_external_rom_boot port %x:" 3900 + "Download failed. fw version = 0x%x\n", 3901 + port, fw_ver1); 3902 + rc = -EINVAL; 3903 + break; 3904 + } 3905 + 3906 + bnx2x_cl45_read(bp, phy, 3907 + MDIO_PMA_DEVAD, 3908 + MDIO_PMA_REG_ROM_VER1, &fw_ver1); 3909 + bnx2x_cl45_read(bp, phy, 3910 + MDIO_PMA_DEVAD, 3911 + MDIO_PMA_REG_M8051_MSGOUT_REG, &fw_msgout); 3912 + 3913 + msleep(1); 3914 + } while (fw_ver1 == 0 || fw_ver1 == 0x4321 || 3915 + ((fw_msgout & 0xff) != 0x03 && (phy->type == 3916 + PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073))); 3912 3917 3913 3918 /* Clear ser_boot_ctl bit */ 3914 3919 bnx2x_cl45_write(bp, phy, 3915 3920 MDIO_PMA_DEVAD, 3916 3921 MDIO_PMA_REG_MISC_CTRL1, 0x0000); 3917 3922 bnx2x_save_bcm_spirom_ver(bp, phy, port); 3923 + 3924 + DP(NETIF_MSG_LINK, 3925 + "bnx2x_8073_8727_external_rom_boot port %x:" 3926 + "Download complete. fw version = 0x%x\n", 3927 + port, fw_ver1); 3928 + 3929 + return rc; 3918 3930 } 3919 3931 3920 3932 static void bnx2x_8073_set_xaui_low_power_mode(struct bnx2x *bp, ··· 4158 4108 4159 4109 DP(NETIF_MSG_LINK, "Before rom RX_ALARM(port1): 0x%x\n", tmp1); 4160 4110 4111 + /** 4112 + * If this is forced speed, set to KR or KX (all other are not 4113 + * supported) 4114 + */ 4115 + /* Swap polarity if required - Must be done only in non-1G mode */ 4116 + if (params->lane_config & PORT_HW_CFG_SWAP_PHY_POLARITY_ENABLED) { 4117 + /* Configure the 8073 to swap _P and _N of the KR lines */ 4118 + DP(NETIF_MSG_LINK, "Swapping polarity for the 8073\n"); 4119 + /* 10G Rx/Tx and 1G Tx signal polarity swap */ 4120 + bnx2x_cl45_read(bp, phy, 4121 + MDIO_PMA_DEVAD, 4122 + MDIO_PMA_REG_8073_OPT_DIGITAL_CTRL, &val); 4123 + bnx2x_cl45_write(bp, phy, 4124 + MDIO_PMA_DEVAD, 4125 + MDIO_PMA_REG_8073_OPT_DIGITAL_CTRL, 4126 + (val | (3<<9))); 4127 + } 4128 + 4129 + 4161 4130 /* Enable CL37 BAM */ 4162 4131 if (REG_RD(bp, params->shmem_base + 4163 4132 offsetof(struct shmem_region, dev_info. ··· 4383 4314 } 4384 4315 4385 4316 if (link_up) { 4317 + /* Swap polarity if required */ 4318 + if (params->lane_config & 4319 + PORT_HW_CFG_SWAP_PHY_POLARITY_ENABLED) { 4320 + /* Configure the 8073 to swap P and N of the KR lines */ 4321 + bnx2x_cl45_read(bp, phy, 4322 + MDIO_XS_DEVAD, 4323 + MDIO_XS_REG_8073_RX_CTRL_PCIE, &val1); 4324 + /** 4325 + * Set bit 3 to invert Rx in 1G mode and clear this bit 4326 + * when it`s in 10G mode. 4327 + */ 4328 + if (vars->line_speed == SPEED_1000) { 4329 + DP(NETIF_MSG_LINK, "Swapping 1G polarity for" 4330 + "the 8073\n"); 4331 + val1 |= (1<<3); 4332 + } else 4333 + val1 &= ~(1<<3); 4334 + 4335 + bnx2x_cl45_write(bp, phy, 4336 + MDIO_XS_DEVAD, 4337 + MDIO_XS_REG_8073_RX_CTRL_PCIE, 4338 + val1); 4339 + } 4386 4340 bnx2x_ext_phy_10G_an_resolve(bp, phy, vars); 4387 4341 bnx2x_8073_resolve_fc(phy, params, vars); 4342 + vars->duplex = DUPLEX_FULL; 4388 4343 } 4389 4344 return link_up; 4390 4345 } ··· 5155 5062 else 5156 5063 vars->line_speed = SPEED_10000; 5157 5064 bnx2x_ext_phy_resolve_fc(phy, params, vars); 5065 + vars->duplex = DUPLEX_FULL; 5158 5066 } 5159 5067 return link_up; 5160 5068 } ··· 5852 5758 DP(NETIF_MSG_LINK, "port %x: External link is down\n", 5853 5759 params->port); 5854 5760 } 5855 - if (link_up) 5761 + if (link_up) { 5856 5762 bnx2x_ext_phy_resolve_fc(phy, params, vars); 5763 + vars->duplex = DUPLEX_FULL; 5764 + DP(NETIF_MSG_LINK, "duplex = 0x%x\n", vars->duplex); 5765 + } 5857 5766 5858 5767 if ((DUAL_MEDIA(params)) && 5859 5768 (phy->req_line_speed == SPEED_1000)) { ··· 5972 5875 MDIO_PMA_REG_8481_LED2_MASK, 5973 5876 0x18); 5974 5877 5878 + /* Select activity source by Tx and Rx, as suggested by PHY AE */ 5975 5879 bnx2x_cl45_write(bp, phy, 5976 5880 MDIO_PMA_DEVAD, 5977 5881 MDIO_PMA_REG_8481_LED3_MASK, 5978 - 0x0040); 5882 + 0x0006); 5883 + 5884 + /* Select the closest activity blink rate to that in 10/100/1000 */ 5885 + bnx2x_cl45_write(bp, phy, 5886 + MDIO_PMA_DEVAD, 5887 + MDIO_PMA_REG_8481_LED3_BLINK, 5888 + 0); 5889 + 5890 + bnx2x_cl45_read(bp, phy, 5891 + MDIO_PMA_DEVAD, 5892 + MDIO_PMA_REG_84823_CTL_LED_CTL_1, &val); 5893 + val |= MDIO_PMA_REG_84823_LED3_STRETCH_EN; /* stretch_en for LED3*/ 5894 + 5895 + bnx2x_cl45_write(bp, phy, 5896 + MDIO_PMA_DEVAD, 5897 + MDIO_PMA_REG_84823_CTL_LED_CTL_1, val); 5979 5898 5980 5899 /* 'Interrupt Mask' */ 5981 5900 bnx2x_cl45_write(bp, phy, ··· 6239 6126 /* Check link 10G */ 6240 6127 if (val2 & (1<<11)) { 6241 6128 vars->line_speed = SPEED_10000; 6129 + vars->duplex = DUPLEX_FULL; 6242 6130 link_up = 1; 6243 6131 bnx2x_ext_phy_10G_an_resolve(bp, phy, vars); 6244 6132 } else { /* Check Legacy speed link */ ··· 6603 6489 MDIO_AN_DEVAD, MDIO_AN_REG_MASTER_STATUS, 6604 6490 &val2); 6605 6491 vars->line_speed = SPEED_10000; 6492 + vars->duplex = DUPLEX_FULL; 6606 6493 DP(NETIF_MSG_LINK, "SFX7101 AN status 0x%x->Master=%x\n", 6607 6494 val2, (val2 & (1<<14))); 6608 6495 bnx2x_ext_phy_10G_an_resolve(bp, phy, vars); ··· 7778 7663 7779 7664 /* PART2 - Download firmware to both phys */ 7780 7665 for (port = PORT_MAX - 1; port >= PORT_0; port--) { 7781 - u16 fw_ver1; 7782 7666 if (CHIP_IS_E2(bp)) 7783 7667 port_of_path = 0; 7784 7668 else ··· 7785 7671 7786 7672 DP(NETIF_MSG_LINK, "Loading spirom for phy address 0x%x\n", 7787 7673 phy_blk[port]->addr); 7788 - bnx2x_8073_8727_external_rom_boot(bp, phy_blk[port], 7789 - port_of_path); 7790 - 7791 - bnx2x_cl45_read(bp, phy_blk[port], 7792 - MDIO_PMA_DEVAD, 7793 - MDIO_PMA_REG_ROM_VER1, &fw_ver1); 7794 - if (fw_ver1 == 0 || fw_ver1 == 0x4321) { 7795 - DP(NETIF_MSG_LINK, 7796 - "bnx2x_8073_common_init_phy port %x:" 7797 - "Download failed. fw version = 0x%x\n", 7798 - port, fw_ver1); 7674 + if (bnx2x_8073_8727_external_rom_boot(bp, phy_blk[port], 7675 + port_of_path)) 7799 7676 return -EINVAL; 7800 - } 7801 7677 7802 7678 /* Only set bit 10 = 1 (Tx power down) */ 7803 7679 bnx2x_cl45_read(bp, phy_blk[port], ··· 7952 7848 } 7953 7849 /* PART2 - Download firmware to both phys */ 7954 7850 for (port = PORT_MAX - 1; port >= PORT_0; port--) { 7955 - u16 fw_ver1; 7956 7851 if (CHIP_IS_E2(bp)) 7957 7852 port_of_path = 0; 7958 7853 else 7959 7854 port_of_path = port; 7960 7855 DP(NETIF_MSG_LINK, "Loading spirom for phy address 0x%x\n", 7961 7856 phy_blk[port]->addr); 7962 - bnx2x_8073_8727_external_rom_boot(bp, phy_blk[port], 7963 - port_of_path); 7964 - bnx2x_cl45_read(bp, phy_blk[port], 7965 - MDIO_PMA_DEVAD, 7966 - MDIO_PMA_REG_ROM_VER1, &fw_ver1); 7967 - if (fw_ver1 == 0 || fw_ver1 == 0x4321) { 7968 - DP(NETIF_MSG_LINK, 7969 - "bnx2x_8727_common_init_phy port %x:" 7970 - "Download failed. fw version = 0x%x\n", 7971 - port, fw_ver1); 7857 + if (bnx2x_8073_8727_external_rom_boot(bp, phy_blk[port], 7858 + port_of_path)) 7972 7859 return -EINVAL; 7973 - } 7974 - } 7975 7860 7861 + } 7976 7862 return 0; 7977 7863 } 7978 7864 ··· 8010 7916 u32 shmem2_base_path[], u32 chip_id) 8011 7917 { 8012 7918 u8 rc = 0; 7919 + u32 phy_ver; 8013 7920 u8 phy_index; 8014 7921 u32 ext_phy_type, ext_phy_config; 8015 7922 DP(NETIF_MSG_LINK, "Begin common phy init\n"); 8016 7923 8017 7924 if (CHIP_REV_IS_EMUL(bp)) 8018 7925 return 0; 7926 + 7927 + /* Check if common init was already done */ 7928 + phy_ver = REG_RD(bp, shmem_base_path[0] + 7929 + offsetof(struct shmem_region, 7930 + port_mb[PORT_0].ext_phy_fw_version)); 7931 + if (phy_ver) { 7932 + DP(NETIF_MSG_LINK, "Not doing common init; phy ver is 0x%x\n", 7933 + phy_ver); 7934 + return 0; 7935 + } 8019 7936 8020 7937 /* Read the ext_phy_type for arbitrary port(0) */ 8021 7938 for (phy_index = EXT_PHY1; phy_index < MAX_PHYS;
+4
drivers/net/bnx2x/bnx2x_reg.h
··· 6194 6194 #define MDIO_CTL_REG_84823_MEDIA_PRIORITY_COPPER 0x0000 6195 6195 #define MDIO_CTL_REG_84823_MEDIA_PRIORITY_FIBER 0x0100 6196 6196 #define MDIO_CTL_REG_84823_MEDIA_FIBER_1G 0x1000 6197 + #define MDIO_CTL_REG_84823_USER_CTRL_REG 0x4005 6198 + #define MDIO_CTL_REG_84823_USER_CTRL_CMS 0x0080 6197 6199 6200 + #define MDIO_PMA_REG_84823_CTL_LED_CTL_1 0xa8e3 6201 + #define MDIO_PMA_REG_84823_LED3_STRETCH_EN 0x0080 6198 6202 6199 6203 #define IGU_FUNC_BASE 0x0400 6200 6204
+1 -1
drivers/net/gianfar.c
··· 1920 1920 if (err) { 1921 1921 for (j = 0; j < i; j++) 1922 1922 free_grp_irqs(&priv->gfargrp[j]); 1923 - goto irq_fail; 1923 + goto irq_fail; 1924 1924 } 1925 1925 } 1926 1926
+12 -2
drivers/net/irda/sh_irda.c
··· 635 635 636 636 ret = sh_irda_set_baudrate(self, speed); 637 637 if (ret < 0) 638 - return ret; 638 + goto sh_irda_hard_xmit_end; 639 639 640 640 self->tx_buff.len = 0; 641 641 if (skb->len) { ··· 652 652 653 653 sh_irda_write(self, IRTFLR, self->tx_buff.len); 654 654 sh_irda_write(self, IRTCTR, ARMOD | TE); 655 - } 655 + } else 656 + goto sh_irda_hard_xmit_end; 656 657 657 658 dev_kfree_skb(skb); 658 659 659 660 return 0; 661 + 662 + sh_irda_hard_xmit_end: 663 + sh_irda_set_baudrate(self, 9600); 664 + netif_wake_queue(self->ndev); 665 + sh_irda_rcv_ctrl(self, 1); 666 + dev_kfree_skb(skb); 667 + 668 + return ret; 669 + 660 670 } 661 671 662 672 static int sh_irda_ioctl(struct net_device *ndev, struct ifreq *ifreq, int cmd)
+2 -3
drivers/net/ns83820.c
··· 1988 1988 } 1989 1989 1990 1990 ndev = alloc_etherdev(sizeof(struct ns83820)); 1991 - dev = PRIV(ndev); 1992 - 1993 1991 err = -ENOMEM; 1994 - if (!dev) 1992 + if (!ndev) 1995 1993 goto out; 1996 1994 1995 + dev = PRIV(ndev); 1997 1996 dev->ndev = ndev; 1998 1997 1999 1998 spin_lock_init(&dev->rx_info.lock);
+12 -7
drivers/net/usb/cdc_ncm.c
··· 54 54 #include <linux/usb/usbnet.h> 55 55 #include <linux/usb/cdc.h> 56 56 57 - #define DRIVER_VERSION "30-Nov-2010" 57 + #define DRIVER_VERSION "17-Jan-2011" 58 58 59 59 /* CDC NCM subclass 3.2.1 */ 60 60 #define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10 ··· 868 868 if (ctx->tx_timer_pending != 0) { 869 869 ctx->tx_timer_pending--; 870 870 restart = 1; 871 - } else 871 + } else { 872 872 restart = 0; 873 + } 873 874 874 875 spin_unlock(&ctx->mtx); 875 876 876 - if (restart) 877 + if (restart) { 878 + spin_lock(&ctx->mtx); 877 879 cdc_ncm_tx_timeout_start(ctx); 878 - else if (ctx->netdev != NULL) 880 + spin_unlock(&ctx->mtx); 881 + } else if (ctx->netdev != NULL) { 879 882 usbnet_start_xmit(NULL, ctx->netdev); 883 + } 880 884 } 881 885 882 886 static struct sk_buff * ··· 904 900 skb_out = cdc_ncm_fill_tx_frame(ctx, skb); 905 901 if (ctx->tx_curr_skb != NULL) 906 902 need_timer = 1; 907 - spin_unlock(&ctx->mtx); 908 903 909 904 /* Start timer, if there is a remaining skb */ 910 905 if (need_timer) ··· 911 908 912 909 if (skb_out) 913 910 dev->net->stats.tx_packets += ctx->tx_curr_frame_num; 911 + 912 + spin_unlock(&ctx->mtx); 914 913 return skb_out; 915 914 916 915 error: ··· 1025 1020 if (((offset + temp) > actlen) || 1026 1021 (temp > CDC_NCM_MAX_DATAGRAM_SIZE) || (temp < ETH_HLEN)) { 1027 1022 pr_debug("invalid frame detected (ignored)" 1028 - "offset[%u]=%u, length=%u, skb=%p\n", 1029 - x, offset, temp, skb_in); 1023 + "offset[%u]=%u, length=%u, skb=%p\n", 1024 + x, offset, temp, skb_in); 1030 1025 if (!x) 1031 1026 goto error; 1032 1027 break;
+62 -31
drivers/net/vmxnet3/vmxnet3_drv.c
··· 48 48 static int enable_mq = 1; 49 49 static int irq_share_mode; 50 50 51 + static void 52 + vmxnet3_write_mac_addr(struct vmxnet3_adapter *adapter, u8 *mac); 53 + 51 54 /* 52 55 * Enable/Disable the given intr 53 56 */ ··· 142 139 { 143 140 u32 ret; 144 141 int i; 142 + unsigned long flags; 145 143 144 + spin_lock_irqsave(&adapter->cmd_lock, flags); 146 145 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_LINK); 147 146 ret = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD); 147 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 148 + 148 149 adapter->link_speed = ret >> 16; 149 150 if (ret & 1) { /* Link is up. */ 150 151 printk(KERN_INFO "%s: NIC Link is Up %d Mbps\n", ··· 190 183 191 184 /* Check if there is an error on xmit/recv queues */ 192 185 if (events & (VMXNET3_ECR_TQERR | VMXNET3_ECR_RQERR)) { 186 + spin_lock(&adapter->cmd_lock); 193 187 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 194 188 VMXNET3_CMD_GET_QUEUE_STATUS); 189 + spin_unlock(&adapter->cmd_lock); 195 190 196 191 for (i = 0; i < adapter->num_tx_queues; i++) 197 192 if (adapter->tqd_start[i].status.stopped) ··· 813 804 skb_transport_header(skb))->doff * 4; 814 805 ctx->copy_size = ctx->eth_ip_hdr_size + ctx->l4_hdr_size; 815 806 } else { 816 - unsigned int pull_size; 817 - 818 807 if (skb->ip_summed == CHECKSUM_PARTIAL) { 819 808 ctx->eth_ip_hdr_size = skb_checksum_start_offset(skb); 820 809 821 810 if (ctx->ipv4) { 822 811 struct iphdr *iph = (struct iphdr *) 823 812 skb_network_header(skb); 824 - if (iph->protocol == IPPROTO_TCP) { 825 - pull_size = ctx->eth_ip_hdr_size + 826 - sizeof(struct tcphdr); 827 - 828 - if (unlikely(!pskb_may_pull(skb, 829 - pull_size))) { 830 - goto err; 831 - } 813 + if (iph->protocol == IPPROTO_TCP) 832 814 ctx->l4_hdr_size = ((struct tcphdr *) 833 815 skb_transport_header(skb))->doff * 4; 834 - } else if (iph->protocol == IPPROTO_UDP) { 816 + else if (iph->protocol == IPPROTO_UDP) 817 + /* 818 + * Use tcp header size so that bytes to 819 + * be copied are more than required by 820 + * the device. 821 + */ 835 822 ctx->l4_hdr_size = 836 - sizeof(struct udphdr); 837 - } else { 823 + sizeof(struct tcphdr); 824 + else 838 825 ctx->l4_hdr_size = 0; 839 - } 840 826 } else { 841 827 /* for simplicity, don't copy L4 headers */ 842 828 ctx->l4_hdr_size = 0; ··· 1863 1859 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 1864 1860 struct Vmxnet3_DriverShared *shared = adapter->shared; 1865 1861 u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable; 1862 + unsigned long flags; 1866 1863 1867 1864 if (grp) { 1868 1865 /* add vlan rx stripping. */ 1869 1866 if (adapter->netdev->features & NETIF_F_HW_VLAN_RX) { 1870 1867 int i; 1871 - struct Vmxnet3_DSDevRead *devRead = &shared->devRead; 1872 1868 adapter->vlan_grp = grp; 1873 1869 1874 - /* update FEATURES to device */ 1875 - devRead->misc.uptFeatures |= UPT1_F_RXVLAN; 1876 - VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 1877 - VMXNET3_CMD_UPDATE_FEATURE); 1878 1870 /* 1879 1871 * Clear entire vfTable; then enable untagged pkts. 1880 1872 * Note: setting one entry in vfTable to non-zero turns ··· 1880 1880 vfTable[i] = 0; 1881 1881 1882 1882 VMXNET3_SET_VFTABLE_ENTRY(vfTable, 0); 1883 + spin_lock_irqsave(&adapter->cmd_lock, flags); 1883 1884 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 1884 1885 VMXNET3_CMD_UPDATE_VLAN_FILTERS); 1886 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 1885 1887 } else { 1886 1888 printk(KERN_ERR "%s: vlan_rx_register when device has " 1887 1889 "no NETIF_F_HW_VLAN_RX\n", netdev->name); ··· 1902 1900 */ 1903 1901 vfTable[i] = 0; 1904 1902 } 1903 + spin_lock_irqsave(&adapter->cmd_lock, flags); 1905 1904 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 1906 1905 VMXNET3_CMD_UPDATE_VLAN_FILTERS); 1907 - 1908 - /* update FEATURES to device */ 1909 - devRead->misc.uptFeatures &= ~UPT1_F_RXVLAN; 1910 - VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 1911 - VMXNET3_CMD_UPDATE_FEATURE); 1906 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 1912 1907 } 1913 1908 } 1914 1909 } ··· 1938 1939 { 1939 1940 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 1940 1941 u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable; 1942 + unsigned long flags; 1941 1943 1942 1944 VMXNET3_SET_VFTABLE_ENTRY(vfTable, vid); 1945 + spin_lock_irqsave(&adapter->cmd_lock, flags); 1943 1946 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 1944 1947 VMXNET3_CMD_UPDATE_VLAN_FILTERS); 1948 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 1945 1949 } 1946 1950 1947 1951 ··· 1953 1951 { 1954 1952 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 1955 1953 u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable; 1954 + unsigned long flags; 1956 1955 1957 1956 VMXNET3_CLEAR_VFTABLE_ENTRY(vfTable, vid); 1957 + spin_lock_irqsave(&adapter->cmd_lock, flags); 1958 1958 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 1959 1959 VMXNET3_CMD_UPDATE_VLAN_FILTERS); 1960 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 1960 1961 } 1961 1962 1962 1963 ··· 1990 1985 vmxnet3_set_mc(struct net_device *netdev) 1991 1986 { 1992 1987 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 1988 + unsigned long flags; 1993 1989 struct Vmxnet3_RxFilterConf *rxConf = 1994 1990 &adapter->shared->devRead.rxFilterConf; 1995 1991 u8 *new_table = NULL; ··· 2026 2020 rxConf->mfTablePA = 0; 2027 2021 } 2028 2022 2023 + spin_lock_irqsave(&adapter->cmd_lock, flags); 2029 2024 if (new_mode != rxConf->rxMode) { 2030 2025 rxConf->rxMode = cpu_to_le32(new_mode); 2031 2026 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, ··· 2035 2028 2036 2029 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 2037 2030 VMXNET3_CMD_UPDATE_MAC_FILTERS); 2031 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 2038 2032 2039 2033 kfree(new_table); 2040 2034 } ··· 2088 2080 devRead->misc.uptFeatures |= UPT1_F_LRO; 2089 2081 devRead->misc.maxNumRxSG = cpu_to_le16(1 + MAX_SKB_FRAGS); 2090 2082 } 2091 - if ((adapter->netdev->features & NETIF_F_HW_VLAN_RX) && 2092 - adapter->vlan_grp) { 2083 + if (adapter->netdev->features & NETIF_F_HW_VLAN_RX) 2093 2084 devRead->misc.uptFeatures |= UPT1_F_RXVLAN; 2094 - } 2095 2085 2096 2086 devRead->misc.mtu = cpu_to_le32(adapter->netdev->mtu); 2097 2087 devRead->misc.queueDescPA = cpu_to_le64(adapter->queue_desc_pa); ··· 2174 2168 /* rx filter settings */ 2175 2169 devRead->rxFilterConf.rxMode = 0; 2176 2170 vmxnet3_restore_vlan(adapter); 2171 + vmxnet3_write_mac_addr(adapter, adapter->netdev->dev_addr); 2172 + 2177 2173 /* the rest are already zeroed */ 2178 2174 } 2179 2175 ··· 2185 2177 { 2186 2178 int err, i; 2187 2179 u32 ret; 2180 + unsigned long flags; 2188 2181 2189 2182 dev_dbg(&adapter->netdev->dev, "%s: skb_buf_size %d, rx_buf_per_pkt %d," 2190 2183 " ring sizes %u %u %u\n", adapter->netdev->name, ··· 2215 2206 adapter->shared_pa)); 2216 2207 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_DSAH, VMXNET3_GET_ADDR_HI( 2217 2208 adapter->shared_pa)); 2209 + spin_lock_irqsave(&adapter->cmd_lock, flags); 2218 2210 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 2219 2211 VMXNET3_CMD_ACTIVATE_DEV); 2220 2212 ret = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD); 2213 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 2221 2214 2222 2215 if (ret != 0) { 2223 2216 printk(KERN_ERR "Failed to activate dev %s: error %u\n", ··· 2266 2255 void 2267 2256 vmxnet3_reset_dev(struct vmxnet3_adapter *adapter) 2268 2257 { 2258 + unsigned long flags; 2259 + spin_lock_irqsave(&adapter->cmd_lock, flags); 2269 2260 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV); 2261 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 2270 2262 } 2271 2263 2272 2264 ··· 2277 2263 vmxnet3_quiesce_dev(struct vmxnet3_adapter *adapter) 2278 2264 { 2279 2265 int i; 2266 + unsigned long flags; 2280 2267 if (test_and_set_bit(VMXNET3_STATE_BIT_QUIESCED, &adapter->state)) 2281 2268 return 0; 2282 2269 2283 2270 2271 + spin_lock_irqsave(&adapter->cmd_lock, flags); 2284 2272 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 2285 2273 VMXNET3_CMD_QUIESCE_DEV); 2274 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 2286 2275 vmxnet3_disable_all_intrs(adapter); 2287 2276 2288 2277 for (i = 0; i < adapter->num_rx_queues; i++) ··· 2443 2426 sz = adapter->rx_buf_per_pkt * VMXNET3_RING_SIZE_ALIGN; 2444 2427 ring0_size = adapter->rx_queue[0].rx_ring[0].size; 2445 2428 ring0_size = (ring0_size + sz - 1) / sz * sz; 2446 - ring0_size = min_t(u32, rq->rx_ring[0].size, VMXNET3_RX_RING_MAX_SIZE / 2429 + ring0_size = min_t(u32, ring0_size, VMXNET3_RX_RING_MAX_SIZE / 2447 2430 sz * sz); 2448 2431 ring1_size = adapter->rx_queue[0].rx_ring[1].size; 2449 2432 comp_size = ring0_size + ring1_size; ··· 2712 2695 break; 2713 2696 } else { 2714 2697 /* If fails to enable required number of MSI-x vectors 2715 - * try enabling 3 of them. One each for rx, tx and event 2698 + * try enabling minimum number of vectors required. 2716 2699 */ 2717 2700 vectors = vector_threshold; 2718 2701 printk(KERN_ERR "Failed to enable %d MSI-X for %s, try" ··· 2735 2718 u32 cfg; 2736 2719 2737 2720 /* intr settings */ 2721 + spin_lock(&adapter->cmd_lock); 2738 2722 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 2739 2723 VMXNET3_CMD_GET_CONF_INTR); 2740 2724 cfg = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD); 2725 + spin_unlock(&adapter->cmd_lock); 2741 2726 adapter->intr.type = cfg & 0x3; 2742 2727 adapter->intr.mask_mode = (cfg >> 2) & 0x3; 2743 2728 ··· 2774 2755 */ 2775 2756 if (err == VMXNET3_LINUX_MIN_MSIX_VECT) { 2776 2757 if (adapter->share_intr != VMXNET3_INTR_BUDDYSHARE 2777 - || adapter->num_rx_queues != 2) { 2758 + || adapter->num_rx_queues != 1) { 2778 2759 adapter->share_intr = VMXNET3_INTR_TXSHARE; 2779 2760 printk(KERN_ERR "Number of rx queues : 1\n"); 2780 2761 adapter->num_rx_queues = 1; ··· 2924 2905 adapter->netdev = netdev; 2925 2906 adapter->pdev = pdev; 2926 2907 2908 + spin_lock_init(&adapter->cmd_lock); 2927 2909 adapter->shared = pci_alloc_consistent(adapter->pdev, 2928 2910 sizeof(struct Vmxnet3_DriverShared), 2929 2911 &adapter->shared_pa); ··· 3128 3108 u8 *arpreq; 3129 3109 struct in_device *in_dev; 3130 3110 struct in_ifaddr *ifa; 3111 + unsigned long flags; 3131 3112 int i = 0; 3132 3113 3133 3114 if (!netif_running(netdev)) 3134 3115 return 0; 3116 + 3117 + for (i = 0; i < adapter->num_rx_queues; i++) 3118 + napi_disable(&adapter->rx_queue[i].napi); 3135 3119 3136 3120 vmxnet3_disable_all_intrs(adapter); 3137 3121 vmxnet3_free_irqs(adapter); ··· 3212 3188 adapter->shared->devRead.pmConfDesc.confPA = cpu_to_le64(virt_to_phys( 3213 3189 pmConf)); 3214 3190 3191 + spin_lock_irqsave(&adapter->cmd_lock, flags); 3215 3192 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 3216 3193 VMXNET3_CMD_UPDATE_PMCFG); 3194 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 3217 3195 3218 3196 pci_save_state(pdev); 3219 3197 pci_enable_wake(pdev, pci_choose_state(pdev, PMSG_SUSPEND), ··· 3230 3204 static int 3231 3205 vmxnet3_resume(struct device *device) 3232 3206 { 3233 - int err; 3207 + int err, i = 0; 3208 + unsigned long flags; 3234 3209 struct pci_dev *pdev = to_pci_dev(device); 3235 3210 struct net_device *netdev = pci_get_drvdata(pdev); 3236 3211 struct vmxnet3_adapter *adapter = netdev_priv(netdev); ··· 3259 3232 3260 3233 pci_enable_wake(pdev, PCI_D0, 0); 3261 3234 3235 + spin_lock_irqsave(&adapter->cmd_lock, flags); 3262 3236 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 3263 3237 VMXNET3_CMD_UPDATE_PMCFG); 3238 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 3264 3239 vmxnet3_alloc_intr_resources(adapter); 3265 3240 vmxnet3_request_irqs(adapter); 3241 + for (i = 0; i < adapter->num_rx_queues; i++) 3242 + napi_enable(&adapter->rx_queue[i].napi); 3266 3243 vmxnet3_enable_all_intrs(adapter); 3267 3244 3268 3245 return 0;
+154 -108
drivers/net/vmxnet3/vmxnet3_ethtool.c
··· 45 45 vmxnet3_set_rx_csum(struct net_device *netdev, u32 val) 46 46 { 47 47 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 48 + unsigned long flags; 48 49 49 50 if (adapter->rxcsum != val) { 50 51 adapter->rxcsum = val; ··· 57 56 adapter->shared->devRead.misc.uptFeatures &= 58 57 ~UPT1_F_RXCSUM; 59 58 59 + spin_lock_irqsave(&adapter->cmd_lock, flags); 60 60 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 61 61 VMXNET3_CMD_UPDATE_FEATURE); 62 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 62 63 } 63 64 } 64 65 return 0; ··· 71 68 static const struct vmxnet3_stat_desc 72 69 vmxnet3_tq_dev_stats[] = { 73 70 /* description, offset */ 74 - { "TSO pkts tx", offsetof(struct UPT1_TxStats, TSOPktsTxOK) }, 75 - { "TSO bytes tx", offsetof(struct UPT1_TxStats, TSOBytesTxOK) }, 76 - { "ucast pkts tx", offsetof(struct UPT1_TxStats, ucastPktsTxOK) }, 77 - { "ucast bytes tx", offsetof(struct UPT1_TxStats, ucastBytesTxOK) }, 78 - { "mcast pkts tx", offsetof(struct UPT1_TxStats, mcastPktsTxOK) }, 79 - { "mcast bytes tx", offsetof(struct UPT1_TxStats, mcastBytesTxOK) }, 80 - { "bcast pkts tx", offsetof(struct UPT1_TxStats, bcastPktsTxOK) }, 81 - { "bcast bytes tx", offsetof(struct UPT1_TxStats, bcastBytesTxOK) }, 82 - { "pkts tx err", offsetof(struct UPT1_TxStats, pktsTxError) }, 83 - { "pkts tx discard", offsetof(struct UPT1_TxStats, pktsTxDiscard) }, 71 + { "Tx Queue#", 0 }, 72 + { " TSO pkts tx", offsetof(struct UPT1_TxStats, TSOPktsTxOK) }, 73 + { " TSO bytes tx", offsetof(struct UPT1_TxStats, TSOBytesTxOK) }, 74 + { " ucast pkts tx", offsetof(struct UPT1_TxStats, ucastPktsTxOK) }, 75 + { " ucast bytes tx", offsetof(struct UPT1_TxStats, ucastBytesTxOK) }, 76 + { " mcast pkts tx", offsetof(struct UPT1_TxStats, mcastPktsTxOK) }, 77 + { " mcast bytes tx", offsetof(struct UPT1_TxStats, mcastBytesTxOK) }, 78 + { " bcast pkts tx", offsetof(struct UPT1_TxStats, bcastPktsTxOK) }, 79 + { " bcast bytes tx", offsetof(struct UPT1_TxStats, bcastBytesTxOK) }, 80 + { " pkts tx err", offsetof(struct UPT1_TxStats, pktsTxError) }, 81 + { " pkts tx discard", offsetof(struct UPT1_TxStats, pktsTxDiscard) }, 84 82 }; 85 83 86 84 /* per tq stats maintained by the driver */ 87 85 static const struct vmxnet3_stat_desc 88 86 vmxnet3_tq_driver_stats[] = { 89 87 /* description, offset */ 90 - {"drv dropped tx total", offsetof(struct vmxnet3_tq_driver_stats, 91 - drop_total) }, 92 - { " too many frags", offsetof(struct vmxnet3_tq_driver_stats, 93 - drop_too_many_frags) }, 94 - { " giant hdr", offsetof(struct vmxnet3_tq_driver_stats, 95 - drop_oversized_hdr) }, 96 - { " hdr err", offsetof(struct vmxnet3_tq_driver_stats, 97 - drop_hdr_inspect_err) }, 98 - { " tso", offsetof(struct vmxnet3_tq_driver_stats, 99 - drop_tso) }, 100 - { "ring full", offsetof(struct vmxnet3_tq_driver_stats, 101 - tx_ring_full) }, 102 - { "pkts linearized", offsetof(struct vmxnet3_tq_driver_stats, 103 - linearized) }, 104 - { "hdr cloned", offsetof(struct vmxnet3_tq_driver_stats, 105 - copy_skb_header) }, 106 - { "giant hdr", offsetof(struct vmxnet3_tq_driver_stats, 107 - oversized_hdr) }, 88 + {" drv dropped tx total", offsetof(struct vmxnet3_tq_driver_stats, 89 + drop_total) }, 90 + { " too many frags", offsetof(struct vmxnet3_tq_driver_stats, 91 + drop_too_many_frags) }, 92 + { " giant hdr", offsetof(struct vmxnet3_tq_driver_stats, 93 + drop_oversized_hdr) }, 94 + { " hdr err", offsetof(struct vmxnet3_tq_driver_stats, 95 + drop_hdr_inspect_err) }, 96 + { " tso", offsetof(struct vmxnet3_tq_driver_stats, 97 + drop_tso) }, 98 + { " ring full", offsetof(struct vmxnet3_tq_driver_stats, 99 + tx_ring_full) }, 100 + { " pkts linearized", offsetof(struct vmxnet3_tq_driver_stats, 101 + linearized) }, 102 + { " hdr cloned", offsetof(struct vmxnet3_tq_driver_stats, 103 + copy_skb_header) }, 104 + { " giant hdr", offsetof(struct vmxnet3_tq_driver_stats, 105 + oversized_hdr) }, 108 106 }; 109 107 110 108 /* per rq stats maintained by the device */ 111 109 static const struct vmxnet3_stat_desc 112 110 vmxnet3_rq_dev_stats[] = { 113 - { "LRO pkts rx", offsetof(struct UPT1_RxStats, LROPktsRxOK) }, 114 - { "LRO byte rx", offsetof(struct UPT1_RxStats, LROBytesRxOK) }, 115 - { "ucast pkts rx", offsetof(struct UPT1_RxStats, ucastPktsRxOK) }, 116 - { "ucast bytes rx", offsetof(struct UPT1_RxStats, ucastBytesRxOK) }, 117 - { "mcast pkts rx", offsetof(struct UPT1_RxStats, mcastPktsRxOK) }, 118 - { "mcast bytes rx", offsetof(struct UPT1_RxStats, mcastBytesRxOK) }, 119 - { "bcast pkts rx", offsetof(struct UPT1_RxStats, bcastPktsRxOK) }, 120 - { "bcast bytes rx", offsetof(struct UPT1_RxStats, bcastBytesRxOK) }, 121 - { "pkts rx out of buf", offsetof(struct UPT1_RxStats, pktsRxOutOfBuf) }, 122 - { "pkts rx err", offsetof(struct UPT1_RxStats, pktsRxError) }, 111 + { "Rx Queue#", 0 }, 112 + { " LRO pkts rx", offsetof(struct UPT1_RxStats, LROPktsRxOK) }, 113 + { " LRO byte rx", offsetof(struct UPT1_RxStats, LROBytesRxOK) }, 114 + { " ucast pkts rx", offsetof(struct UPT1_RxStats, ucastPktsRxOK) }, 115 + { " ucast bytes rx", offsetof(struct UPT1_RxStats, ucastBytesRxOK) }, 116 + { " mcast pkts rx", offsetof(struct UPT1_RxStats, mcastPktsRxOK) }, 117 + { " mcast bytes rx", offsetof(struct UPT1_RxStats, mcastBytesRxOK) }, 118 + { " bcast pkts rx", offsetof(struct UPT1_RxStats, bcastPktsRxOK) }, 119 + { " bcast bytes rx", offsetof(struct UPT1_RxStats, bcastBytesRxOK) }, 120 + { " pkts rx OOB", offsetof(struct UPT1_RxStats, pktsRxOutOfBuf) }, 121 + { " pkts rx err", offsetof(struct UPT1_RxStats, pktsRxError) }, 123 122 }; 124 123 125 124 /* per rq stats maintained by the driver */ 126 125 static const struct vmxnet3_stat_desc 127 126 vmxnet3_rq_driver_stats[] = { 128 127 /* description, offset */ 129 - { "drv dropped rx total", offsetof(struct vmxnet3_rq_driver_stats, 130 - drop_total) }, 131 - { " err", offsetof(struct vmxnet3_rq_driver_stats, 132 - drop_err) }, 133 - { " fcs", offsetof(struct vmxnet3_rq_driver_stats, 134 - drop_fcs) }, 135 - { "rx buf alloc fail", offsetof(struct vmxnet3_rq_driver_stats, 136 - rx_buf_alloc_failure) }, 128 + { " drv dropped rx total", offsetof(struct vmxnet3_rq_driver_stats, 129 + drop_total) }, 130 + { " err", offsetof(struct vmxnet3_rq_driver_stats, 131 + drop_err) }, 132 + { " fcs", offsetof(struct vmxnet3_rq_driver_stats, 133 + drop_fcs) }, 134 + { " rx buf alloc fail", offsetof(struct vmxnet3_rq_driver_stats, 135 + rx_buf_alloc_failure) }, 137 136 }; 138 137 139 138 /* gloabl stats maintained by the driver */ 140 139 static const struct vmxnet3_stat_desc 141 140 vmxnet3_global_stats[] = { 142 141 /* description, offset */ 143 - { "tx timeout count", offsetof(struct vmxnet3_adapter, 142 + { "tx timeout count", offsetof(struct vmxnet3_adapter, 144 143 tx_timeout_count) } 145 144 }; 146 145 ··· 156 151 struct UPT1_TxStats *devTxStats; 157 152 struct UPT1_RxStats *devRxStats; 158 153 struct net_device_stats *net_stats = &netdev->stats; 154 + unsigned long flags; 159 155 int i; 160 156 161 157 adapter = netdev_priv(netdev); 162 158 163 159 /* Collect the dev stats into the shared area */ 160 + spin_lock_irqsave(&adapter->cmd_lock, flags); 164 161 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_STATS); 162 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 165 163 166 164 memset(net_stats, 0, sizeof(*net_stats)); 167 165 for (i = 0; i < adapter->num_tx_queues; i++) { ··· 201 193 static int 202 194 vmxnet3_get_sset_count(struct net_device *netdev, int sset) 203 195 { 196 + struct vmxnet3_adapter *adapter = netdev_priv(netdev); 204 197 switch (sset) { 205 198 case ETH_SS_STATS: 206 - return ARRAY_SIZE(vmxnet3_tq_dev_stats) + 207 - ARRAY_SIZE(vmxnet3_tq_driver_stats) + 208 - ARRAY_SIZE(vmxnet3_rq_dev_stats) + 209 - ARRAY_SIZE(vmxnet3_rq_driver_stats) + 199 + return (ARRAY_SIZE(vmxnet3_tq_dev_stats) + 200 + ARRAY_SIZE(vmxnet3_tq_driver_stats)) * 201 + adapter->num_tx_queues + 202 + (ARRAY_SIZE(vmxnet3_rq_dev_stats) + 203 + ARRAY_SIZE(vmxnet3_rq_driver_stats)) * 204 + adapter->num_rx_queues + 210 205 ARRAY_SIZE(vmxnet3_global_stats); 211 206 default: 212 207 return -EOPNOTSUPP; ··· 217 206 } 218 207 219 208 209 + /* Should be multiple of 4 */ 210 + #define NUM_TX_REGS 8 211 + #define NUM_RX_REGS 12 212 + 220 213 static int 221 214 vmxnet3_get_regs_len(struct net_device *netdev) 222 215 { 223 - return 20 * sizeof(u32); 216 + struct vmxnet3_adapter *adapter = netdev_priv(netdev); 217 + return (adapter->num_tx_queues * NUM_TX_REGS * sizeof(u32) + 218 + adapter->num_rx_queues * NUM_RX_REGS * sizeof(u32)); 224 219 } 225 220 226 221 ··· 257 240 static void 258 241 vmxnet3_get_strings(struct net_device *netdev, u32 stringset, u8 *buf) 259 242 { 243 + struct vmxnet3_adapter *adapter = netdev_priv(netdev); 260 244 if (stringset == ETH_SS_STATS) { 261 - int i; 245 + int i, j; 246 + for (j = 0; j < adapter->num_tx_queues; j++) { 247 + for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_dev_stats); i++) { 248 + memcpy(buf, vmxnet3_tq_dev_stats[i].desc, 249 + ETH_GSTRING_LEN); 250 + buf += ETH_GSTRING_LEN; 251 + } 252 + for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_driver_stats); 253 + i++) { 254 + memcpy(buf, vmxnet3_tq_driver_stats[i].desc, 255 + ETH_GSTRING_LEN); 256 + buf += ETH_GSTRING_LEN; 257 + } 258 + } 262 259 263 - for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_dev_stats); i++) { 264 - memcpy(buf, vmxnet3_tq_dev_stats[i].desc, 265 - ETH_GSTRING_LEN); 266 - buf += ETH_GSTRING_LEN; 260 + for (j = 0; j < adapter->num_rx_queues; j++) { 261 + for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_dev_stats); i++) { 262 + memcpy(buf, vmxnet3_rq_dev_stats[i].desc, 263 + ETH_GSTRING_LEN); 264 + buf += ETH_GSTRING_LEN; 265 + } 266 + for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_driver_stats); 267 + i++) { 268 + memcpy(buf, vmxnet3_rq_driver_stats[i].desc, 269 + ETH_GSTRING_LEN); 270 + buf += ETH_GSTRING_LEN; 271 + } 267 272 } 268 - for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_driver_stats); i++) { 269 - memcpy(buf, vmxnet3_tq_driver_stats[i].desc, 270 - ETH_GSTRING_LEN); 271 - buf += ETH_GSTRING_LEN; 272 - } 273 - for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_dev_stats); i++) { 274 - memcpy(buf, vmxnet3_rq_dev_stats[i].desc, 275 - ETH_GSTRING_LEN); 276 - buf += ETH_GSTRING_LEN; 277 - } 278 - for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_driver_stats); i++) { 279 - memcpy(buf, vmxnet3_rq_driver_stats[i].desc, 280 - ETH_GSTRING_LEN); 281 - buf += ETH_GSTRING_LEN; 282 - } 273 + 283 274 for (i = 0; i < ARRAY_SIZE(vmxnet3_global_stats); i++) { 284 275 memcpy(buf, vmxnet3_global_stats[i].desc, 285 276 ETH_GSTRING_LEN); ··· 302 277 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 303 278 u8 lro_requested = (data & ETH_FLAG_LRO) == 0 ? 0 : 1; 304 279 u8 lro_present = (netdev->features & NETIF_F_LRO) == 0 ? 0 : 1; 280 + unsigned long flags; 305 281 306 282 if (data & ~ETH_FLAG_LRO) 307 283 return -EOPNOTSUPP; ··· 318 292 else 319 293 adapter->shared->devRead.misc.uptFeatures &= 320 294 ~UPT1_F_LRO; 295 + spin_lock_irqsave(&adapter->cmd_lock, flags); 321 296 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 322 297 VMXNET3_CMD_UPDATE_FEATURE); 298 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 323 299 } 324 300 return 0; 325 301 } ··· 331 303 struct ethtool_stats *stats, u64 *buf) 332 304 { 333 305 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 306 + unsigned long flags; 334 307 u8 *base; 335 308 int i; 336 309 int j = 0; 337 310 311 + spin_lock_irqsave(&adapter->cmd_lock, flags); 338 312 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_STATS); 313 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 339 314 340 315 /* this does assume each counter is 64-bit wide */ 341 - /* TODO change this for multiple queues */ 316 + for (j = 0; j < adapter->num_tx_queues; j++) { 317 + base = (u8 *)&adapter->tqd_start[j].stats; 318 + *buf++ = (u64)j; 319 + for (i = 1; i < ARRAY_SIZE(vmxnet3_tq_dev_stats); i++) 320 + *buf++ = *(u64 *)(base + 321 + vmxnet3_tq_dev_stats[i].offset); 342 322 343 - base = (u8 *)&adapter->tqd_start[j].stats; 344 - for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_dev_stats); i++) 345 - *buf++ = *(u64 *)(base + vmxnet3_tq_dev_stats[i].offset); 323 + base = (u8 *)&adapter->tx_queue[j].stats; 324 + for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_driver_stats); i++) 325 + *buf++ = *(u64 *)(base + 326 + vmxnet3_tq_driver_stats[i].offset); 327 + } 346 328 347 - base = (u8 *)&adapter->tx_queue[j].stats; 348 - for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_driver_stats); i++) 349 - *buf++ = *(u64 *)(base + vmxnet3_tq_driver_stats[i].offset); 329 + for (j = 0; j < adapter->num_tx_queues; j++) { 330 + base = (u8 *)&adapter->rqd_start[j].stats; 331 + *buf++ = (u64) j; 332 + for (i = 1; i < ARRAY_SIZE(vmxnet3_rq_dev_stats); i++) 333 + *buf++ = *(u64 *)(base + 334 + vmxnet3_rq_dev_stats[i].offset); 350 335 351 - base = (u8 *)&adapter->rqd_start[j].stats; 352 - for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_dev_stats); i++) 353 - *buf++ = *(u64 *)(base + vmxnet3_rq_dev_stats[i].offset); 354 - 355 - base = (u8 *)&adapter->rx_queue[j].stats; 356 - for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_driver_stats); i++) 357 - *buf++ = *(u64 *)(base + vmxnet3_rq_driver_stats[i].offset); 336 + base = (u8 *)&adapter->rx_queue[j].stats; 337 + for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_driver_stats); i++) 338 + *buf++ = *(u64 *)(base + 339 + vmxnet3_rq_driver_stats[i].offset); 340 + } 358 341 359 342 base = (u8 *)adapter; 360 343 for (i = 0; i < ARRAY_SIZE(vmxnet3_global_stats); i++) ··· 378 339 { 379 340 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 380 341 u32 *buf = p; 381 - int i = 0; 342 + int i = 0, j = 0; 382 343 383 344 memset(p, 0, vmxnet3_get_regs_len(netdev)); 384 345 ··· 387 348 /* Update vmxnet3_get_regs_len if we want to dump more registers */ 388 349 389 350 /* make each ring use multiple of 16 bytes */ 390 - /* TODO change this for multiple queues */ 391 - buf[0] = adapter->tx_queue[i].tx_ring.next2fill; 392 - buf[1] = adapter->tx_queue[i].tx_ring.next2comp; 393 - buf[2] = adapter->tx_queue[i].tx_ring.gen; 394 - buf[3] = 0; 351 + for (i = 0; i < adapter->num_tx_queues; i++) { 352 + buf[j++] = adapter->tx_queue[i].tx_ring.next2fill; 353 + buf[j++] = adapter->tx_queue[i].tx_ring.next2comp; 354 + buf[j++] = adapter->tx_queue[i].tx_ring.gen; 355 + buf[j++] = 0; 395 356 396 - buf[4] = adapter->tx_queue[i].comp_ring.next2proc; 397 - buf[5] = adapter->tx_queue[i].comp_ring.gen; 398 - buf[6] = adapter->tx_queue[i].stopped; 399 - buf[7] = 0; 357 + buf[j++] = adapter->tx_queue[i].comp_ring.next2proc; 358 + buf[j++] = adapter->tx_queue[i].comp_ring.gen; 359 + buf[j++] = adapter->tx_queue[i].stopped; 360 + buf[j++] = 0; 361 + } 400 362 401 - buf[8] = adapter->rx_queue[i].rx_ring[0].next2fill; 402 - buf[9] = adapter->rx_queue[i].rx_ring[0].next2comp; 403 - buf[10] = adapter->rx_queue[i].rx_ring[0].gen; 404 - buf[11] = 0; 363 + for (i = 0; i < adapter->num_rx_queues; i++) { 364 + buf[j++] = adapter->rx_queue[i].rx_ring[0].next2fill; 365 + buf[j++] = adapter->rx_queue[i].rx_ring[0].next2comp; 366 + buf[j++] = adapter->rx_queue[i].rx_ring[0].gen; 367 + buf[j++] = 0; 405 368 406 - buf[12] = adapter->rx_queue[i].rx_ring[1].next2fill; 407 - buf[13] = adapter->rx_queue[i].rx_ring[1].next2comp; 408 - buf[14] = adapter->rx_queue[i].rx_ring[1].gen; 409 - buf[15] = 0; 369 + buf[j++] = adapter->rx_queue[i].rx_ring[1].next2fill; 370 + buf[j++] = adapter->rx_queue[i].rx_ring[1].next2comp; 371 + buf[j++] = adapter->rx_queue[i].rx_ring[1].gen; 372 + buf[j++] = 0; 410 373 411 - buf[16] = adapter->rx_queue[i].comp_ring.next2proc; 412 - buf[17] = adapter->rx_queue[i].comp_ring.gen; 413 - buf[18] = 0; 414 - buf[19] = 0; 374 + buf[j++] = adapter->rx_queue[i].comp_ring.next2proc; 375 + buf[j++] = adapter->rx_queue[i].comp_ring.gen; 376 + buf[j++] = 0; 377 + buf[j++] = 0; 378 + } 379 + 415 380 } 416 381 417 382 ··· 617 574 const struct ethtool_rxfh_indir *p) 618 575 { 619 576 unsigned int i; 577 + unsigned long flags; 620 578 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 621 579 struct UPT1_RSSConf *rssConf = adapter->rss_conf; 622 580 ··· 636 592 for (i = 0; i < rssConf->indTableSize; i++) 637 593 rssConf->indTable[i] = p->ring_index[i]; 638 594 595 + spin_lock_irqsave(&adapter->cmd_lock, flags); 639 596 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 640 597 VMXNET3_CMD_UPDATE_RSSIDT); 598 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 641 599 642 600 return 0; 643 601
+4 -3
drivers/net/vmxnet3/vmxnet3_int.h
··· 68 68 /* 69 69 * Version numbers 70 70 */ 71 - #define VMXNET3_DRIVER_VERSION_STRING "1.0.16.0-k" 71 + #define VMXNET3_DRIVER_VERSION_STRING "1.0.25.0-k" 72 72 73 73 /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ 74 - #define VMXNET3_DRIVER_VERSION_NUM 0x01001000 74 + #define VMXNET3_DRIVER_VERSION_NUM 0x01001900 75 75 76 76 #if defined(CONFIG_PCI_MSI) 77 77 /* RSS only makes sense if MSI-X is supported. */ ··· 289 289 290 290 #define VMXNET3_LINUX_MAX_MSIX_VECT (VMXNET3_DEVICE_MAX_TX_QUEUES + \ 291 291 VMXNET3_DEVICE_MAX_RX_QUEUES + 1) 292 - #define VMXNET3_LINUX_MIN_MSIX_VECT 3 /* 1 for each : tx, rx and event */ 292 + #define VMXNET3_LINUX_MIN_MSIX_VECT 2 /* 1 for tx-rx pair and 1 for event */ 293 293 294 294 295 295 struct vmxnet3_intr { ··· 317 317 struct vmxnet3_rx_queue rx_queue[VMXNET3_DEVICE_MAX_RX_QUEUES]; 318 318 struct vlan_group *vlan_grp; 319 319 struct vmxnet3_intr intr; 320 + spinlock_t cmd_lock; 320 321 struct Vmxnet3_DriverShared *shared; 321 322 struct Vmxnet3_PMConf *pm_conf; 322 323 struct Vmxnet3_TxQueueDesc *tqd_start; /* all tx queue desc */
+4
drivers/net/wireless/ath/ath5k/base.c
··· 2294 2294 int i; 2295 2295 bool needreset = false; 2296 2296 2297 + mutex_lock(&sc->lock); 2298 + 2297 2299 for (i = 0; i < ARRAY_SIZE(sc->txqs); i++) { 2298 2300 if (sc->txqs[i].setup) { 2299 2301 txq = &sc->txqs[i]; ··· 2322 2320 "TX queues stuck, resetting\n"); 2323 2321 ath5k_reset(sc, NULL, true); 2324 2322 } 2323 + 2324 + mutex_unlock(&sc->lock); 2325 2325 2326 2326 ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 2327 2327 msecs_to_jiffies(ATH5K_TX_COMPLETE_POLL_INT));
+5 -5
drivers/net/wireless/ath/ath9k/ar9002_calib.c
··· 679 679 680 680 /* Do NF cal only at longer intervals */ 681 681 if (longcal || nfcal_pending) { 682 - /* Do periodic PAOffset Cal */ 683 - ar9002_hw_pa_cal(ah, false); 684 - ar9002_hw_olc_temp_compensation(ah); 685 - 686 682 /* 687 683 * Get the value from the previous NF cal and update 688 684 * history buffer. ··· 693 697 ath9k_hw_loadnf(ah, ah->curchan); 694 698 } 695 699 696 - if (longcal) 700 + if (longcal) { 697 701 ath9k_hw_start_nfcal(ah, false); 702 + /* Do periodic PAOffset Cal */ 703 + ar9002_hw_pa_cal(ah, false); 704 + ar9002_hw_olc_temp_compensation(ah); 705 + } 698 706 } 699 707 700 708 return iscaldone;
+1 -1
drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
··· 1842 1842 1843 1843 static const u32 ar9300PciePhy_pll_on_clkreq_disable_L1_2p2[][2] = { 1844 1844 /* Addr allmodes */ 1845 - {0x00004040, 0x08212e5e}, 1845 + {0x00004040, 0x0821265e}, 1846 1846 {0x00004040, 0x0008003b}, 1847 1847 {0x00004044, 0x00000000}, 1848 1848 };
+2 -2
drivers/net/wireless/ath/ath9k/ar9003_hw.c
··· 146 146 /* Sleep Setting */ 147 147 148 148 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, 149 - ar9300PciePhy_clkreq_enable_L1_2p2, 150 - ARRAY_SIZE(ar9300PciePhy_clkreq_enable_L1_2p2), 149 + ar9300PciePhy_pll_on_clkreq_disable_L1_2p2, 150 + ARRAY_SIZE(ar9300PciePhy_pll_on_clkreq_disable_L1_2p2), 151 151 2); 152 152 153 153 /* Fast clock modal settings */
+1 -1
drivers/net/wireless/ath/ath9k/htc.h
··· 78 78 u8 node_idx; 79 79 u8 vif_idx; 80 80 u8 tidno; 81 - u32 flags; /* ATH9K_HTC_TX_* */ 81 + __be32 flags; /* ATH9K_HTC_TX_* */ 82 82 u8 key_type; 83 83 u8 keyix; 84 84 u8 reserved[26];
+5 -3
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
··· 113 113 114 114 if (ieee80211_is_data(fc)) { 115 115 struct tx_frame_hdr tx_hdr; 116 + u32 flags = 0; 116 117 u8 *qc; 117 118 118 119 memset(&tx_hdr, 0, sizeof(struct tx_frame_hdr)); ··· 137 136 /* Check for RTS protection */ 138 137 if (priv->hw->wiphy->rts_threshold != (u32) -1) 139 138 if (skb->len > priv->hw->wiphy->rts_threshold) 140 - tx_hdr.flags |= ATH9K_HTC_TX_RTSCTS; 139 + flags |= ATH9K_HTC_TX_RTSCTS; 141 140 142 141 /* CTS-to-self */ 143 - if (!(tx_hdr.flags & ATH9K_HTC_TX_RTSCTS) && 142 + if (!(flags & ATH9K_HTC_TX_RTSCTS) && 144 143 (priv->op_flags & OP_PROTECT_ENABLE)) 145 - tx_hdr.flags |= ATH9K_HTC_TX_CTSONLY; 144 + flags |= ATH9K_HTC_TX_CTSONLY; 146 145 146 + tx_hdr.flags = cpu_to_be32(flags); 147 147 tx_hdr.key_type = ath9k_cmn_get_hw_crypto_keytype(skb); 148 148 if (tx_hdr.key_type == ATH9K_KEY_TYPE_CLEAR) 149 149 tx_hdr.keyix = (u8) ATH9K_TXKEYIX_INVALID;
+1 -1
drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c
··· 168 168 /* not using .cfg overwrite */ 169 169 radio_cfg = iwl_eeprom_query16(priv, EEPROM_RADIO_CONFIG); 170 170 priv->cfg->valid_tx_ant = EEPROM_RF_CFG_TX_ANT_MSK(radio_cfg); 171 - priv->cfg->valid_rx_ant = EEPROM_RF_CFG_TX_ANT_MSK(radio_cfg); 171 + priv->cfg->valid_rx_ant = EEPROM_RF_CFG_RX_ANT_MSK(radio_cfg); 172 172 if (!priv->cfg->valid_tx_ant || !priv->cfg->valid_rx_ant) { 173 173 IWL_ERR(priv, "Invalid chain (0X%x, 0X%x)\n", 174 174 priv->cfg->valid_tx_ant,
+2
drivers/net/wireless/iwmc3200wifi/netdev.c
··· 126 126 ndev = alloc_netdev_mq(0, "wlan%d", ether_setup, IWM_TX_QUEUES); 127 127 if (!ndev) { 128 128 dev_err(dev, "no memory for network device instance\n"); 129 + ret = -ENOMEM; 129 130 goto out_priv; 130 131 } 131 132 ··· 139 138 GFP_KERNEL); 140 139 if (!iwm->umac_profile) { 141 140 dev_err(dev, "Couldn't alloc memory for profile\n"); 141 + ret = -ENOMEM; 142 142 goto out_profile; 143 143 } 144 144
+1
drivers/net/wireless/rt2x00/rt2x00firmware.c
··· 58 58 59 59 if (!fw || !fw->size || !fw->data) { 60 60 ERROR(rt2x00dev, "Failed to read Firmware.\n"); 61 + release_firmware(fw); 61 62 return -ENOENT; 62 63 } 63 64
+16 -2
drivers/s390/net/qeth_l2_main.c
··· 831 831 return NETDEV_TX_OK; 832 832 } 833 833 834 - static int qeth_l2_open(struct net_device *dev) 834 + static int __qeth_l2_open(struct net_device *dev) 835 835 { 836 836 struct qeth_card *card = dev->ml_priv; 837 837 int rc = 0; 838 838 839 839 QETH_CARD_TEXT(card, 4, "qethopen"); 840 + if (card->state == CARD_STATE_UP) 841 + return rc; 840 842 if (card->state != CARD_STATE_SOFTSETUP) 841 843 return -ENODEV; 842 844 ··· 857 855 } else 858 856 rc = -EIO; 859 857 return rc; 858 + } 859 + 860 + static int qeth_l2_open(struct net_device *dev) 861 + { 862 + struct qeth_card *card = dev->ml_priv; 863 + 864 + QETH_CARD_TEXT(card, 5, "qethope_"); 865 + if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { 866 + QETH_CARD_TEXT(card, 3, "openREC"); 867 + return -ERESTARTSYS; 868 + } 869 + return __qeth_l2_open(dev); 860 870 } 861 871 862 872 static int qeth_l2_stop(struct net_device *dev) ··· 1060 1046 if (recover_flag == CARD_STATE_RECOVER) { 1061 1047 if (recovery_mode && 1062 1048 card->info.type != QETH_CARD_TYPE_OSN) { 1063 - qeth_l2_open(card->dev); 1049 + __qeth_l2_open(card->dev); 1064 1050 } else { 1065 1051 rtnl_lock(); 1066 1052 dev_open(card->dev);
+19 -3
drivers/s390/net/qeth_l3_main.c
··· 2998 2998 */ 2999 2999 if (iph->protocol == IPPROTO_UDP) 3000 3000 hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_UDP; 3001 - hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ; 3001 + hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ | 3002 + QETH_HDR_EXT_CSUM_HDR_REQ; 3003 + iph->check = 0; 3002 3004 if (card->options.performance_stats) 3003 3005 card->perf_stats.tx_csum++; 3004 3006 } ··· 3242 3240 return NETDEV_TX_OK; 3243 3241 } 3244 3242 3245 - static int qeth_l3_open(struct net_device *dev) 3243 + static int __qeth_l3_open(struct net_device *dev) 3246 3244 { 3247 3245 struct qeth_card *card = dev->ml_priv; 3248 3246 int rc = 0; 3249 3247 3250 3248 QETH_CARD_TEXT(card, 4, "qethopen"); 3249 + if (card->state == CARD_STATE_UP) 3250 + return rc; 3251 3251 if (card->state != CARD_STATE_SOFTSETUP) 3252 3252 return -ENODEV; 3253 3253 card->data.state = CH_STATE_UP; ··· 3262 3258 } else 3263 3259 rc = -EIO; 3264 3260 return rc; 3261 + } 3262 + 3263 + static int qeth_l3_open(struct net_device *dev) 3264 + { 3265 + struct qeth_card *card = dev->ml_priv; 3266 + 3267 + QETH_CARD_TEXT(card, 5, "qethope_"); 3268 + if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { 3269 + QETH_CARD_TEXT(card, 3, "openREC"); 3270 + return -ERESTARTSYS; 3271 + } 3272 + return __qeth_l3_open(dev); 3265 3273 } 3266 3274 3267 3275 static int qeth_l3_stop(struct net_device *dev) ··· 3580 3564 netif_carrier_off(card->dev); 3581 3565 if (recover_flag == CARD_STATE_RECOVER) { 3582 3566 if (recovery_mode) 3583 - qeth_l3_open(card->dev); 3567 + __qeth_l3_open(card->dev); 3584 3568 else { 3585 3569 rtnl_lock(); 3586 3570 dev_open(card->dev);
+1 -1
include/linux/ieee80211.h
··· 959 959 /* block-ack parameters */ 960 960 #define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002 961 961 #define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C 962 - #define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0 962 + #define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFC0 963 963 #define IEEE80211_DELBA_PARAM_TID_MASK 0xF000 964 964 #define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800 965 965
+1
include/net/sctp/user.h
··· 78 78 #define SCTP_GET_PEER_ADDR_INFO 15 79 79 #define SCTP_DELAYED_ACK_TIME 16 80 80 #define SCTP_DELAYED_ACK SCTP_DELAYED_ACK_TIME 81 + #define SCTP_DELAYED_SACK SCTP_DELAYED_ACK_TIME 81 82 #define SCTP_CONTEXT 17 82 83 #define SCTP_FRAGMENT_INTERLEAVE 18 83 84 #define SCTP_PARTIAL_DELIVERY_POINT 19 /* Set/Get partial delivery point */
+3 -3
net/batman-adv/main.h
··· 151 151 } \ 152 152 while (0) 153 153 #else /* !CONFIG_BATMAN_ADV_DEBUG */ 154 - static inline void bat_dbg(char type __attribute__((unused)), 155 - struct bat_priv *bat_priv __attribute__((unused)), 156 - char *fmt __attribute__((unused)), ...) 154 + static inline void bat_dbg(char type __always_unused, 155 + struct bat_priv *bat_priv __always_unused, 156 + char *fmt __always_unused, ...) 157 157 { 158 158 } 159 159 #endif
+7 -7
net/batman-adv/packet.h
··· 63 63 uint8_t num_hna; 64 64 uint8_t gw_flags; /* flags related to gateway class */ 65 65 uint8_t align; 66 - } __attribute__((packed)); 66 + } __packed; 67 67 68 68 #define BAT_PACKET_LEN sizeof(struct batman_packet) 69 69 ··· 76 76 uint8_t orig[6]; 77 77 uint16_t seqno; 78 78 uint8_t uid; 79 - } __attribute__((packed)); 79 + } __packed; 80 80 81 81 #define BAT_RR_LEN 16 82 82 ··· 93 93 uint8_t uid; 94 94 uint8_t rr_cur; 95 95 uint8_t rr[BAT_RR_LEN][ETH_ALEN]; 96 - } __attribute__((packed)); 96 + } __packed; 97 97 98 98 struct unicast_packet { 99 99 uint8_t packet_type; 100 100 uint8_t version; /* batman version field */ 101 101 uint8_t dest[6]; 102 102 uint8_t ttl; 103 - } __attribute__((packed)); 103 + } __packed; 104 104 105 105 struct unicast_frag_packet { 106 106 uint8_t packet_type; ··· 110 110 uint8_t flags; 111 111 uint8_t orig[6]; 112 112 uint16_t seqno; 113 - } __attribute__((packed)); 113 + } __packed; 114 114 115 115 struct bcast_packet { 116 116 uint8_t packet_type; ··· 118 118 uint8_t orig[6]; 119 119 uint8_t ttl; 120 120 uint32_t seqno; 121 - } __attribute__((packed)); 121 + } __packed; 122 122 123 123 struct vis_packet { 124 124 uint8_t packet_type; ··· 131 131 * neighbors */ 132 132 uint8_t target_orig[6]; /* who should receive this packet */ 133 133 uint8_t sender_orig[6]; /* who sent or rebroadcasted this packet */ 134 - } __attribute__((packed)); 134 + } __packed; 135 135 136 136 #endif /* _NET_BATMAN_ADV_PACKET_H_ */
+2 -2
net/batman-adv/types.h
··· 246 246 /* this packet might be part of the vis send queue. */ 247 247 struct sk_buff *skb_packet; 248 248 /* vis_info may follow here*/ 249 - } __attribute__((packed)); 249 + } __packed; 250 250 251 251 struct vis_info_entry { 252 252 uint8_t src[ETH_ALEN]; 253 253 uint8_t dest[ETH_ALEN]; 254 254 uint8_t quality; /* quality = 0 means HNA */ 255 - } __attribute__((packed)); 255 + } __packed; 256 256 257 257 struct recvlist_node { 258 258 struct list_head list;
+5 -3
net/batman-adv/unicast.c
··· 229 229 if (!bat_priv->primary_if) 230 230 goto dropped; 231 231 232 - unicast_packet = (struct unicast_packet *) skb->data; 233 - 234 - memcpy(&tmp_uc, unicast_packet, uc_hdr_len); 235 232 frag_skb = dev_alloc_skb(data_len - (data_len / 2) + ucf_hdr_len); 233 + if (!frag_skb) 234 + goto dropped; 235 + 236 + unicast_packet = (struct unicast_packet *) skb->data; 237 + memcpy(&tmp_uc, unicast_packet, uc_hdr_len); 236 238 skb_split(skb, frag_skb, data_len / 2); 237 239 238 240 if (my_skb_head_push(skb, ucf_hdr_len - uc_hdr_len) < 0 ||
+5 -4
net/caif/cfcnfg.c
··· 191 191 struct cflayer *servl = NULL; 192 192 struct cfcnfg_phyinfo *phyinfo = NULL; 193 193 u8 phyid = 0; 194 + 194 195 caif_assert(adap_layer != NULL); 195 196 channel_id = adap_layer->id; 196 197 if (adap_layer->dn == NULL || channel_id == 0) { ··· 200 199 goto end; 201 200 } 202 201 servl = cfmuxl_remove_uplayer(cnfg->mux, channel_id); 203 - if (servl == NULL) 204 - goto end; 205 - layer_set_up(servl, NULL); 206 - ret = cfctrl_linkdown_req(cnfg->ctrl, channel_id, adap_layer); 207 202 if (servl == NULL) { 208 203 pr_err("PROTOCOL ERROR - Error removing service_layer Channel_Id(%d)", 209 204 channel_id); 210 205 ret = -EINVAL; 211 206 goto end; 212 207 } 208 + layer_set_up(servl, NULL); 209 + ret = cfctrl_linkdown_req(cnfg->ctrl, channel_id, adap_layer); 210 + if (ret) 211 + goto end; 213 212 caif_assert(channel_id == servl->id); 214 213 if (adap_layer->dn != NULL) { 215 214 phyid = cfsrvl_getphyid(adap_layer->dn);
+3
net/can/bcm.c
··· 1256 1256 struct sockaddr_can *addr = 1257 1257 (struct sockaddr_can *)msg->msg_name; 1258 1258 1259 + if (msg->msg_namelen < sizeof(*addr)) 1260 + return -EINVAL; 1261 + 1259 1262 if (addr->can_family != AF_CAN) 1260 1263 return -EINVAL; 1261 1264
+3
net/can/raw.c
··· 649 649 struct sockaddr_can *addr = 650 650 (struct sockaddr_can *)msg->msg_name; 651 651 652 + if (msg->msg_namelen < sizeof(*addr)) 653 + return -EINVAL; 654 + 652 655 if (addr->can_family != AF_CAN) 653 656 return -EINVAL; 654 657
+3 -3
net/core/dev.c
··· 2001 2001 2002 2002 static int harmonize_features(struct sk_buff *skb, __be16 protocol, int features) 2003 2003 { 2004 - if (!can_checksum_protocol(protocol, features)) { 2004 + if (!can_checksum_protocol(features, protocol)) { 2005 2005 features &= ~NETIF_F_ALL_CSUM; 2006 2006 features &= ~NETIF_F_SG; 2007 2007 } else if (illegal_highdma(skb->dev, skb)) { ··· 2023 2023 return harmonize_features(skb, protocol, features); 2024 2024 } 2025 2025 2026 - features &= skb->dev->vlan_features; 2026 + features &= (skb->dev->vlan_features | NETIF_F_HW_VLAN_TX); 2027 2027 2028 2028 if (protocol != htons(ETH_P_8021Q)) { 2029 2029 return harmonize_features(skb, protocol, features); 2030 2030 } else { 2031 2031 features &= NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | 2032 - NETIF_F_GEN_CSUM; 2032 + NETIF_F_GEN_CSUM | NETIF_F_HW_VLAN_TX; 2033 2033 return harmonize_features(skb, protocol, features); 2034 2034 } 2035 2035 }
+1 -1
net/core/rtnetlink.c
··· 1820 1820 if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) 1821 1821 return -EPERM; 1822 1822 1823 - if (kind == 2 && (nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { 1823 + if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { 1824 1824 struct sock *rtnl; 1825 1825 rtnl_dumpit_func dumpit; 1826 1826
+1 -1
net/ipv4/inet_diag.c
··· 858 858 nlmsg_len(nlh) < hdrlen) 859 859 return -EINVAL; 860 860 861 - if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { 861 + if (nlh->nlmsg_flags & NLM_F_DUMP) { 862 862 if (nlmsg_attrlen(nlh, hdrlen)) { 863 863 struct nlattr *attr; 864 864
-3
net/ipv6/addrconf.c
··· 420 420 dev->type == ARPHRD_TUNNEL6 || 421 421 dev->type == ARPHRD_SIT || 422 422 dev->type == ARPHRD_NONE) { 423 - printk(KERN_INFO 424 - "%s: Disabled Privacy Extensions\n", 425 - dev->name); 426 423 ndev->cnf.use_tempaddr = -1; 427 424 } else { 428 425 in6_dev_hold(ndev);
+2 -9
net/mac80211/agg-rx.c
··· 185 185 struct ieee80211_mgmt *mgmt, 186 186 size_t len) 187 187 { 188 - struct ieee80211_hw *hw = &local->hw; 189 - struct ieee80211_conf *conf = &hw->conf; 190 188 struct tid_ampdu_rx *tid_agg_rx; 191 189 u16 capab, tid, timeout, ba_policy, buf_size, start_seq_num, status; 192 190 u8 dialog_token; ··· 229 231 goto end_no_lock; 230 232 } 231 233 /* determine default buffer size */ 232 - if (buf_size == 0) { 233 - struct ieee80211_supported_band *sband; 234 - 235 - sband = local->hw.wiphy->bands[conf->channel->band]; 236 - buf_size = IEEE80211_MIN_AMPDU_BUF; 237 - buf_size = buf_size << sband->ht_cap.ampdu_factor; 238 - } 234 + if (buf_size == 0) 235 + buf_size = IEEE80211_MAX_AMPDU_BUF; 239 236 240 237 241 238 /* examine state machine */
+11 -1
net/mac80211/main.c
··· 39 39 MODULE_PARM_DESC(ieee80211_disable_40mhz_24ghz, 40 40 "Disable 40MHz support in the 2.4GHz band"); 41 41 42 + static struct lock_class_key ieee80211_rx_skb_queue_class; 43 + 42 44 void ieee80211_configure_filter(struct ieee80211_local *local) 43 45 { 44 46 u64 mc; ··· 571 569 spin_lock_init(&local->filter_lock); 572 570 spin_lock_init(&local->queue_stop_reason_lock); 573 571 574 - skb_queue_head_init(&local->rx_skb_queue); 572 + /* 573 + * The rx_skb_queue is only accessed from tasklets, 574 + * but other SKB queues are used from within IRQ 575 + * context. Therefore, this one needs a different 576 + * locking class so our direct, non-irq-safe use of 577 + * the queue's lock doesn't throw lockdep warnings. 578 + */ 579 + skb_queue_head_init_class(&local->rx_skb_queue, 580 + &ieee80211_rx_skb_queue_class); 575 581 576 582 INIT_DELAYED_WORK(&local->scan_work, ieee80211_scan_work); 577 583
+2 -2
net/netfilter/nf_conntrack_netlink.c
··· 924 924 u16 zone; 925 925 int err; 926 926 927 - if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) 927 + if (nlh->nlmsg_flags & NLM_F_DUMP) 928 928 return netlink_dump_start(ctnl, skb, nlh, ctnetlink_dump_table, 929 929 ctnetlink_done); 930 930 ··· 1787 1787 u16 zone; 1788 1788 int err; 1789 1789 1790 - if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { 1790 + if (nlh->nlmsg_flags & NLM_F_DUMP) { 1791 1791 return netlink_dump_start(ctnl, skb, nlh, 1792 1792 ctnetlink_exp_dump_table, 1793 1793 ctnetlink_exp_done);
+1 -1
net/netlink/genetlink.c
··· 519 519 security_netlink_recv(skb, CAP_NET_ADMIN)) 520 520 return -EPERM; 521 521 522 - if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { 522 + if (nlh->nlmsg_flags & NLM_F_DUMP) { 523 523 if (ops->dumpit == NULL) 524 524 return -EOPNOTSUPP; 525 525
+2 -2
net/sctp/socket.c
··· 3428 3428 retval = sctp_setsockopt_peer_addr_params(sk, optval, optlen); 3429 3429 break; 3430 3430 3431 - case SCTP_DELAYED_ACK: 3431 + case SCTP_DELAYED_SACK: 3432 3432 retval = sctp_setsockopt_delayed_ack(sk, optval, optlen); 3433 3433 break; 3434 3434 case SCTP_PARTIAL_DELIVERY_POINT: ··· 5333 5333 retval = sctp_getsockopt_peer_addr_params(sk, len, optval, 5334 5334 optlen); 5335 5335 break; 5336 - case SCTP_DELAYED_ACK: 5336 + case SCTP_DELAYED_SACK: 5337 5337 retval = sctp_getsockopt_delayed_ack(sk, len, optval, 5338 5338 optlen); 5339 5339 break;
+1 -1
net/xfrm/xfrm_user.c
··· 2189 2189 2190 2190 if ((type == (XFRM_MSG_GETSA - XFRM_MSG_BASE) || 2191 2191 type == (XFRM_MSG_GETPOLICY - XFRM_MSG_BASE)) && 2192 - (nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { 2192 + (nlh->nlmsg_flags & NLM_F_DUMP)) { 2193 2193 if (link->dump == NULL) 2194 2194 return -EINVAL; 2195 2195