diff options
author | David S. Miller <davem@davemloft.net> | 2011-07-06 02:23:37 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-07-06 02:23:37 -0400 |
commit | e12fe68ce34d60c04bb1ddb1d3cc5c3022388fe4 (patch) | |
tree | 83c0e192ccaa4752c80b6131a7d0aa8272b5d0d0 /drivers/net | |
parent | 7329f0d58de01878d9ce4f0be7a76e136f223eef (diff) | |
parent | 712ae51afd55b20c04c5383d02ba5d10233313b1 (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/8139too.c | 1 | ||||
-rw-r--r-- | drivers/net/Kconfig | 3 | ||||
-rw-r--r-- | drivers/net/bna/bnad.c | 7 | ||||
-rw-r--r-- | drivers/net/bnx2x/bnx2x_main.c | 6 | ||||
-rw-r--r-- | drivers/net/can/Kconfig | 4 | ||||
-rw-r--r-- | drivers/net/cxgb3/sge.c | 4 | ||||
-rw-r--r-- | drivers/net/greth.c | 7 | ||||
-rw-r--r-- | drivers/net/hamradio/6pack.c | 4 | ||||
-rw-r--r-- | drivers/net/hamradio/mkiss.c | 4 | ||||
-rw-r--r-- | drivers/net/natsemi.c | 3 | ||||
-rw-r--r-- | drivers/net/ppp_deflate.c | 5 | ||||
-rw-r--r-- | drivers/net/qlge/qlge.h | 3 | ||||
-rw-r--r-- | drivers/net/qlge/qlge_main.c | 40 | ||||
-rw-r--r-- | drivers/net/r8169.c | 2 | ||||
-rw-r--r-- | drivers/net/rionet.c | 28 | ||||
-rw-r--r-- | drivers/net/usb/kalmia.c | 42 | ||||
-rw-r--r-- | drivers/net/usb/zaurus.c | 10 | ||||
-rw-r--r-- | drivers/net/vmxnet3/vmxnet3_drv.c | 135 | ||||
-rw-r--r-- | drivers/net/vmxnet3/vmxnet3_int.h | 4 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath5k/eeprom.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/pci.c | 6 |
21 files changed, 195 insertions, 131 deletions
diff --git a/drivers/net/8139too.c b/drivers/net/8139too.c index ed6355cc5261..c2672c692d6f 100644 --- a/drivers/net/8139too.c +++ b/drivers/net/8139too.c | |||
@@ -993,6 +993,7 @@ static int __devinit rtl8139_init_one (struct pci_dev *pdev, | |||
993 | * features | 993 | * features |
994 | */ | 994 | */ |
995 | dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA; | 995 | dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA; |
996 | dev->vlan_features = dev->features; | ||
996 | 997 | ||
997 | dev->irq = pdev->irq; | 998 | dev->irq = pdev->irq; |
998 | 999 | ||
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index f5919c28a4b8..4d68a264df9b 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -3415,7 +3415,8 @@ config NETCONSOLE | |||
3415 | 3415 | ||
3416 | config NETCONSOLE_DYNAMIC | 3416 | config NETCONSOLE_DYNAMIC |
3417 | bool "Dynamic reconfiguration of logging targets" | 3417 | bool "Dynamic reconfiguration of logging targets" |
3418 | depends on NETCONSOLE && SYSFS && CONFIGFS_FS | 3418 | depends on NETCONSOLE && SYSFS && CONFIGFS_FS && \ |
3419 | !(NETCONSOLE=y && CONFIGFS_FS=m) | ||
3419 | help | 3420 | help |
3420 | This option enables the ability to dynamically reconfigure target | 3421 | This option enables the ability to dynamically reconfigure target |
3421 | parameters (interface, IP addresses, port numbers, MAC addresses) | 3422 | parameters (interface, IP addresses, port numbers, MAC addresses) |
diff --git a/drivers/net/bna/bnad.c b/drivers/net/bna/bnad.c index 7d25a97d33f6..44e219c910da 100644 --- a/drivers/net/bna/bnad.c +++ b/drivers/net/bna/bnad.c | |||
@@ -1111,7 +1111,7 @@ bnad_mbox_irq_alloc(struct bnad *bnad, | |||
1111 | struct bna_intr_info *intr_info) | 1111 | struct bna_intr_info *intr_info) |
1112 | { | 1112 | { |
1113 | int err = 0; | 1113 | int err = 0; |
1114 | unsigned long flags; | 1114 | unsigned long irq_flags = 0, flags; |
1115 | u32 irq; | 1115 | u32 irq; |
1116 | irq_handler_t irq_handler; | 1116 | irq_handler_t irq_handler; |
1117 | 1117 | ||
@@ -1125,18 +1125,17 @@ bnad_mbox_irq_alloc(struct bnad *bnad, | |||
1125 | if (bnad->cfg_flags & BNAD_CF_MSIX) { | 1125 | if (bnad->cfg_flags & BNAD_CF_MSIX) { |
1126 | irq_handler = (irq_handler_t)bnad_msix_mbox_handler; | 1126 | irq_handler = (irq_handler_t)bnad_msix_mbox_handler; |
1127 | irq = bnad->msix_table[bnad->msix_num - 1].vector; | 1127 | irq = bnad->msix_table[bnad->msix_num - 1].vector; |
1128 | flags = 0; | ||
1129 | intr_info->intr_type = BNA_INTR_T_MSIX; | 1128 | intr_info->intr_type = BNA_INTR_T_MSIX; |
1130 | intr_info->idl[0].vector = bnad->msix_num - 1; | 1129 | intr_info->idl[0].vector = bnad->msix_num - 1; |
1131 | } else { | 1130 | } else { |
1132 | irq_handler = (irq_handler_t)bnad_isr; | 1131 | irq_handler = (irq_handler_t)bnad_isr; |
1133 | irq = bnad->pcidev->irq; | 1132 | irq = bnad->pcidev->irq; |
1134 | flags = IRQF_SHARED; | 1133 | irq_flags = IRQF_SHARED; |
1135 | intr_info->intr_type = BNA_INTR_T_INTX; | 1134 | intr_info->intr_type = BNA_INTR_T_INTX; |
1136 | /* intr_info->idl.vector = 0 ? */ | 1135 | /* intr_info->idl.vector = 0 ? */ |
1137 | } | 1136 | } |
1138 | spin_unlock_irqrestore(&bnad->bna_lock, flags); | 1137 | spin_unlock_irqrestore(&bnad->bna_lock, flags); |
1139 | 1138 | flags = irq_flags; | |
1140 | sprintf(bnad->mbox_irq_name, "%s", BNAD_NAME); | 1139 | sprintf(bnad->mbox_irq_name, "%s", BNAD_NAME); |
1141 | 1140 | ||
1142 | /* | 1141 | /* |
diff --git a/drivers/net/bnx2x/bnx2x_main.c b/drivers/net/bnx2x/bnx2x_main.c index 98604350a811..5b4a8f34b13c 100644 --- a/drivers/net/bnx2x/bnx2x_main.c +++ b/drivers/net/bnx2x/bnx2x_main.c | |||
@@ -50,6 +50,7 @@ | |||
50 | #include <linux/zlib.h> | 50 | #include <linux/zlib.h> |
51 | #include <linux/io.h> | 51 | #include <linux/io.h> |
52 | #include <linux/stringify.h> | 52 | #include <linux/stringify.h> |
53 | #include <linux/vmalloc.h> | ||
53 | 54 | ||
54 | #include "bnx2x.h" | 55 | #include "bnx2x.h" |
55 | #include "bnx2x_init.h" | 56 | #include "bnx2x_init.h" |
@@ -5152,8 +5153,7 @@ static int bnx2x_gunzip_init(struct bnx2x *bp) | |||
5152 | if (bp->strm == NULL) | 5153 | if (bp->strm == NULL) |
5153 | goto gunzip_nomem2; | 5154 | goto gunzip_nomem2; |
5154 | 5155 | ||
5155 | bp->strm->workspace = kmalloc(zlib_inflate_workspacesize(), | 5156 | bp->strm->workspace = vmalloc(zlib_inflate_workspacesize()); |
5156 | GFP_KERNEL); | ||
5157 | if (bp->strm->workspace == NULL) | 5157 | if (bp->strm->workspace == NULL) |
5158 | goto gunzip_nomem3; | 5158 | goto gunzip_nomem3; |
5159 | 5159 | ||
@@ -5177,7 +5177,7 @@ gunzip_nomem1: | |||
5177 | static void bnx2x_gunzip_end(struct bnx2x *bp) | 5177 | static void bnx2x_gunzip_end(struct bnx2x *bp) |
5178 | { | 5178 | { |
5179 | if (bp->strm) { | 5179 | if (bp->strm) { |
5180 | kfree(bp->strm->workspace); | 5180 | vfree(bp->strm->workspace); |
5181 | kfree(bp->strm); | 5181 | kfree(bp->strm); |
5182 | bp->strm = NULL; | 5182 | bp->strm = NULL; |
5183 | } | 5183 | } |
diff --git a/drivers/net/can/Kconfig b/drivers/net/can/Kconfig index 906366b54037..f6c98fb4a517 100644 --- a/drivers/net/can/Kconfig +++ b/drivers/net/can/Kconfig | |||
@@ -34,7 +34,7 @@ config CAN_SLCAN | |||
34 | config CAN_DEV | 34 | config CAN_DEV |
35 | tristate "Platform CAN drivers with Netlink support" | 35 | tristate "Platform CAN drivers with Netlink support" |
36 | depends on CAN | 36 | depends on CAN |
37 | default Y | 37 | default y |
38 | ---help--- | 38 | ---help--- |
39 | Enables the common framework for platform CAN drivers with Netlink | 39 | Enables the common framework for platform CAN drivers with Netlink |
40 | support. This is the standard library for CAN drivers. | 40 | support. This is the standard library for CAN drivers. |
@@ -43,7 +43,7 @@ config CAN_DEV | |||
43 | config CAN_CALC_BITTIMING | 43 | config CAN_CALC_BITTIMING |
44 | bool "CAN bit-timing calculation" | 44 | bool "CAN bit-timing calculation" |
45 | depends on CAN_DEV | 45 | depends on CAN_DEV |
46 | default Y | 46 | default y |
47 | ---help--- | 47 | ---help--- |
48 | If enabled, CAN bit-timing parameters will be calculated for the | 48 | If enabled, CAN bit-timing parameters will be calculated for the |
49 | bit-rate specified via Netlink argument "bitrate" when the device | 49 | bit-rate specified via Netlink argument "bitrate" when the device |
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c index 3f562ba2f0c9..76bf5892b962 100644 --- a/drivers/net/cxgb3/sge.c +++ b/drivers/net/cxgb3/sge.c | |||
@@ -2026,7 +2026,7 @@ static void rx_eth(struct adapter *adap, struct sge_rspq *rq, | |||
2026 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 2026 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
2027 | } else | 2027 | } else |
2028 | skb_checksum_none_assert(skb); | 2028 | skb_checksum_none_assert(skb); |
2029 | skb_record_rx_queue(skb, qs - &adap->sge.qs[0]); | 2029 | skb_record_rx_queue(skb, qs - &adap->sge.qs[pi->first_qset]); |
2030 | 2030 | ||
2031 | if (unlikely(p->vlan_valid)) { | 2031 | if (unlikely(p->vlan_valid)) { |
2032 | struct vlan_group *grp = pi->vlan_grp; | 2032 | struct vlan_group *grp = pi->vlan_grp; |
@@ -2145,7 +2145,7 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs, | |||
2145 | if (!complete) | 2145 | if (!complete) |
2146 | return; | 2146 | return; |
2147 | 2147 | ||
2148 | skb_record_rx_queue(skb, qs - &adap->sge.qs[0]); | 2148 | skb_record_rx_queue(skb, qs - &adap->sge.qs[pi->first_qset]); |
2149 | 2149 | ||
2150 | if (unlikely(cpl->vlan_valid)) { | 2150 | if (unlikely(cpl->vlan_valid)) { |
2151 | struct vlan_group *grp = pi->vlan_grp; | 2151 | struct vlan_group *grp = pi->vlan_grp; |
diff --git a/drivers/net/greth.c b/drivers/net/greth.c index 82c3767ec5f8..16ce45c11934 100644 --- a/drivers/net/greth.c +++ b/drivers/net/greth.c | |||
@@ -1017,11 +1017,10 @@ static int greth_set_mac_add(struct net_device *dev, void *p) | |||
1017 | return -EINVAL; | 1017 | return -EINVAL; |
1018 | 1018 | ||
1019 | memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); | 1019 | memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); |
1020 | GRETH_REGSAVE(regs->esa_msb, dev->dev_addr[0] << 8 | dev->dev_addr[1]); | ||
1021 | GRETH_REGSAVE(regs->esa_lsb, dev->dev_addr[2] << 24 | dev->dev_addr[3] << 16 | | ||
1022 | dev->dev_addr[4] << 8 | dev->dev_addr[5]); | ||
1020 | 1023 | ||
1021 | GRETH_REGSAVE(regs->esa_msb, addr->sa_data[0] << 8 | addr->sa_data[1]); | ||
1022 | GRETH_REGSAVE(regs->esa_lsb, | ||
1023 | addr->sa_data[2] << 24 | addr-> | ||
1024 | sa_data[3] << 16 | addr->sa_data[4] << 8 | addr->sa_data[5]); | ||
1025 | return 0; | 1024 | return 0; |
1026 | } | 1025 | } |
1027 | 1026 | ||
diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c index 3e5d0b6b6516..0d283781bc5e 100644 --- a/drivers/net/hamradio/6pack.c +++ b/drivers/net/hamradio/6pack.c | |||
@@ -692,10 +692,10 @@ static void sixpack_close(struct tty_struct *tty) | |||
692 | { | 692 | { |
693 | struct sixpack *sp; | 693 | struct sixpack *sp; |
694 | 694 | ||
695 | write_lock(&disc_data_lock); | 695 | write_lock_bh(&disc_data_lock); |
696 | sp = tty->disc_data; | 696 | sp = tty->disc_data; |
697 | tty->disc_data = NULL; | 697 | tty->disc_data = NULL; |
698 | write_unlock(&disc_data_lock); | 698 | write_unlock_bh(&disc_data_lock); |
699 | if (!sp) | 699 | if (!sp) |
700 | return; | 700 | return; |
701 | 701 | ||
diff --git a/drivers/net/hamradio/mkiss.c b/drivers/net/hamradio/mkiss.c index 4c628393c8b1..bc02968cee16 100644 --- a/drivers/net/hamradio/mkiss.c +++ b/drivers/net/hamradio/mkiss.c | |||
@@ -813,10 +813,10 @@ static void mkiss_close(struct tty_struct *tty) | |||
813 | { | 813 | { |
814 | struct mkiss *ax; | 814 | struct mkiss *ax; |
815 | 815 | ||
816 | write_lock(&disc_data_lock); | 816 | write_lock_bh(&disc_data_lock); |
817 | ax = tty->disc_data; | 817 | ax = tty->disc_data; |
818 | tty->disc_data = NULL; | 818 | tty->disc_data = NULL; |
819 | write_unlock(&disc_data_lock); | 819 | write_unlock_bh(&disc_data_lock); |
820 | 820 | ||
821 | if (!ax) | 821 | if (!ax) |
822 | return; | 822 | return; |
diff --git a/drivers/net/natsemi.c b/drivers/net/natsemi.c index b78be088c4ad..8f8b65af9ed5 100644 --- a/drivers/net/natsemi.c +++ b/drivers/net/natsemi.c | |||
@@ -2360,7 +2360,8 @@ static void netdev_rx(struct net_device *dev, int *work_done, int work_to_do) | |||
2360 | PCI_DMA_FROMDEVICE); | 2360 | PCI_DMA_FROMDEVICE); |
2361 | } else { | 2361 | } else { |
2362 | pci_unmap_single(np->pci_dev, np->rx_dma[entry], | 2362 | pci_unmap_single(np->pci_dev, np->rx_dma[entry], |
2363 | buflen, PCI_DMA_FROMDEVICE); | 2363 | buflen + NATSEMI_PADDING, |
2364 | PCI_DMA_FROMDEVICE); | ||
2364 | skb_put(skb = np->rx_skbuff[entry], pkt_len); | 2365 | skb_put(skb = np->rx_skbuff[entry], pkt_len); |
2365 | np->rx_skbuff[entry] = NULL; | 2366 | np->rx_skbuff[entry] = NULL; |
2366 | } | 2367 | } |
diff --git a/drivers/net/ppp_deflate.c b/drivers/net/ppp_deflate.c index 31e9407a0739..1dbdf82a6dfd 100644 --- a/drivers/net/ppp_deflate.c +++ b/drivers/net/ppp_deflate.c | |||
@@ -305,7 +305,7 @@ static void z_decomp_free(void *arg) | |||
305 | 305 | ||
306 | if (state) { | 306 | if (state) { |
307 | zlib_inflateEnd(&state->strm); | 307 | zlib_inflateEnd(&state->strm); |
308 | kfree(state->strm.workspace); | 308 | vfree(state->strm.workspace); |
309 | kfree(state); | 309 | kfree(state); |
310 | } | 310 | } |
311 | } | 311 | } |
@@ -345,8 +345,7 @@ static void *z_decomp_alloc(unsigned char *options, int opt_len) | |||
345 | 345 | ||
346 | state->w_size = w_size; | 346 | state->w_size = w_size; |
347 | state->strm.next_out = NULL; | 347 | state->strm.next_out = NULL; |
348 | state->strm.workspace = kmalloc(zlib_inflate_workspacesize(), | 348 | state->strm.workspace = vmalloc(zlib_inflate_workspacesize()); |
349 | GFP_KERNEL|__GFP_REPEAT); | ||
350 | if (state->strm.workspace == NULL) | 349 | if (state->strm.workspace == NULL) |
351 | goto out_free; | 350 | goto out_free; |
352 | 351 | ||
diff --git a/drivers/net/qlge/qlge.h b/drivers/net/qlge/qlge.h index 7d8483f9012e..794252c0aedd 100644 --- a/drivers/net/qlge/qlge.h +++ b/drivers/net/qlge/qlge.h | |||
@@ -17,7 +17,7 @@ | |||
17 | */ | 17 | */ |
18 | #define DRV_NAME "qlge" | 18 | #define DRV_NAME "qlge" |
19 | #define DRV_STRING "QLogic 10 Gigabit PCI-E Ethernet Driver " | 19 | #define DRV_STRING "QLogic 10 Gigabit PCI-E Ethernet Driver " |
20 | #define DRV_VERSION "v1.00.00.27.00.00-01" | 20 | #define DRV_VERSION "v1.00.00.29.00.00-01" |
21 | 21 | ||
22 | #define WQ_ADDR_ALIGN 0x3 /* 4 byte alignment */ | 22 | #define WQ_ADDR_ALIGN 0x3 /* 4 byte alignment */ |
23 | 23 | ||
@@ -1997,6 +1997,7 @@ enum { | |||
1997 | QL_LB_LINK_UP = 10, | 1997 | QL_LB_LINK_UP = 10, |
1998 | QL_FRC_COREDUMP = 11, | 1998 | QL_FRC_COREDUMP = 11, |
1999 | QL_EEH_FATAL = 12, | 1999 | QL_EEH_FATAL = 12, |
2000 | QL_ASIC_RECOVERY = 14, /* We are in ascic recovery. */ | ||
2000 | }; | 2001 | }; |
2001 | 2002 | ||
2002 | /* link_status bit definitions */ | 2003 | /* link_status bit definitions */ |
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index be89610f16a8..68fbfac7a3bf 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c | |||
@@ -2152,6 +2152,10 @@ void ql_queue_asic_error(struct ql_adapter *qdev) | |||
2152 | * thread | 2152 | * thread |
2153 | */ | 2153 | */ |
2154 | clear_bit(QL_ADAPTER_UP, &qdev->flags); | 2154 | clear_bit(QL_ADAPTER_UP, &qdev->flags); |
2155 | /* Set asic recovery bit to indicate reset process that we are | ||
2156 | * in fatal error recovery process rather than normal close | ||
2157 | */ | ||
2158 | set_bit(QL_ASIC_RECOVERY, &qdev->flags); | ||
2155 | queue_delayed_work(qdev->workqueue, &qdev->asic_reset_work, 0); | 2159 | queue_delayed_work(qdev->workqueue, &qdev->asic_reset_work, 0); |
2156 | } | 2160 | } |
2157 | 2161 | ||
@@ -2166,23 +2170,20 @@ static void ql_process_chip_ae_intr(struct ql_adapter *qdev, | |||
2166 | return; | 2170 | return; |
2167 | 2171 | ||
2168 | case CAM_LOOKUP_ERR_EVENT: | 2172 | case CAM_LOOKUP_ERR_EVENT: |
2169 | netif_err(qdev, link, qdev->ndev, | 2173 | netdev_err(qdev->ndev, "Multiple CAM hits lookup occurred.\n"); |
2170 | "Multiple CAM hits lookup occurred.\n"); | 2174 | netdev_err(qdev->ndev, "This event shouldn't occur.\n"); |
2171 | netif_err(qdev, drv, qdev->ndev, | ||
2172 | "This event shouldn't occur.\n"); | ||
2173 | ql_queue_asic_error(qdev); | 2175 | ql_queue_asic_error(qdev); |
2174 | return; | 2176 | return; |
2175 | 2177 | ||
2176 | case SOFT_ECC_ERROR_EVENT: | 2178 | case SOFT_ECC_ERROR_EVENT: |
2177 | netif_err(qdev, rx_err, qdev->ndev, | 2179 | netdev_err(qdev->ndev, "Soft ECC error detected.\n"); |
2178 | "Soft ECC error detected.\n"); | ||
2179 | ql_queue_asic_error(qdev); | 2180 | ql_queue_asic_error(qdev); |
2180 | break; | 2181 | break; |
2181 | 2182 | ||
2182 | case PCI_ERR_ANON_BUF_RD: | 2183 | case PCI_ERR_ANON_BUF_RD: |
2183 | netif_err(qdev, rx_err, qdev->ndev, | 2184 | netdev_err(qdev->ndev, "PCI error occurred when reading " |
2184 | "PCI error occurred when reading anonymous buffers from rx_ring %d.\n", | 2185 | "anonymous buffers from rx_ring %d.\n", |
2185 | ib_ae_rsp->q_id); | 2186 | ib_ae_rsp->q_id); |
2186 | ql_queue_asic_error(qdev); | 2187 | ql_queue_asic_error(qdev); |
2187 | break; | 2188 | break; |
2188 | 2189 | ||
@@ -2437,11 +2438,10 @@ static irqreturn_t qlge_isr(int irq, void *dev_id) | |||
2437 | */ | 2438 | */ |
2438 | if (var & STS_FE) { | 2439 | if (var & STS_FE) { |
2439 | ql_queue_asic_error(qdev); | 2440 | ql_queue_asic_error(qdev); |
2440 | netif_err(qdev, intr, qdev->ndev, | 2441 | netdev_err(qdev->ndev, "Got fatal error, STS = %x.\n", var); |
2441 | "Got fatal error, STS = %x.\n", var); | ||
2442 | var = ql_read32(qdev, ERR_STS); | 2442 | var = ql_read32(qdev, ERR_STS); |
2443 | netif_err(qdev, intr, qdev->ndev, | 2443 | netdev_err(qdev->ndev, "Resetting chip. " |
2444 | "Resetting chip. Error Status Register = 0x%x\n", var); | 2444 | "Error Status Register = 0x%x\n", var); |
2445 | return IRQ_HANDLED; | 2445 | return IRQ_HANDLED; |
2446 | } | 2446 | } |
2447 | 2447 | ||
@@ -3818,11 +3818,17 @@ static int ql_adapter_reset(struct ql_adapter *qdev) | |||
3818 | end_jiffies = jiffies + | 3818 | end_jiffies = jiffies + |
3819 | max((unsigned long)1, usecs_to_jiffies(30)); | 3819 | max((unsigned long)1, usecs_to_jiffies(30)); |
3820 | 3820 | ||
3821 | /* Stop management traffic. */ | 3821 | /* Check if bit is set then skip the mailbox command and |
3822 | ql_mb_set_mgmnt_traffic_ctl(qdev, MB_SET_MPI_TFK_STOP); | 3822 | * clear the bit, else we are in normal reset process. |
3823 | */ | ||
3824 | if (!test_bit(QL_ASIC_RECOVERY, &qdev->flags)) { | ||
3825 | /* Stop management traffic. */ | ||
3826 | ql_mb_set_mgmnt_traffic_ctl(qdev, MB_SET_MPI_TFK_STOP); | ||
3823 | 3827 | ||
3824 | /* Wait for the NIC and MGMNT FIFOs to empty. */ | 3828 | /* Wait for the NIC and MGMNT FIFOs to empty. */ |
3825 | ql_wait_fifo_empty(qdev); | 3829 | ql_wait_fifo_empty(qdev); |
3830 | } else | ||
3831 | clear_bit(QL_ASIC_RECOVERY, &qdev->flags); | ||
3826 | 3832 | ||
3827 | ql_write32(qdev, RST_FO, (RST_FO_FR << 16) | RST_FO_FR); | 3833 | ql_write32(qdev, RST_FO, (RST_FO_FR << 16) | RST_FO_FR); |
3828 | 3834 | ||
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index fbd68383ca60..ef1a43dd145b 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -753,7 +753,7 @@ static void rtl8168_oob_notify(struct rtl8169_private *tp, u8 cmd) | |||
753 | msleep(2); | 753 | msleep(2); |
754 | for (i = 0; i < 5; i++) { | 754 | for (i = 0; i < 5; i++) { |
755 | udelay(100); | 755 | udelay(100); |
756 | if (!(RTL_R32(ERIDR) & ERIAR_FLAG)) | 756 | if (!(RTL_R32(ERIAR) & ERIAR_FLAG)) |
757 | break; | 757 | break; |
758 | } | 758 | } |
759 | 759 | ||
diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c index bcdc54f2fe55..86ac38c96bcf 100644 --- a/drivers/net/rionet.c +++ b/drivers/net/rionet.c | |||
@@ -378,7 +378,7 @@ static int rionet_close(struct net_device *ndev) | |||
378 | 378 | ||
379 | static void rionet_remove(struct rio_dev *rdev) | 379 | static void rionet_remove(struct rio_dev *rdev) |
380 | { | 380 | { |
381 | struct net_device *ndev = NULL; | 381 | struct net_device *ndev = rio_get_drvdata(rdev); |
382 | struct rionet_peer *peer, *tmp; | 382 | struct rionet_peer *peer, *tmp; |
383 | 383 | ||
384 | free_pages((unsigned long)rionet_active, rdev->net->hport->sys_size ? | 384 | free_pages((unsigned long)rionet_active, rdev->net->hport->sys_size ? |
@@ -433,22 +433,12 @@ static const struct net_device_ops rionet_netdev_ops = { | |||
433 | .ndo_set_mac_address = eth_mac_addr, | 433 | .ndo_set_mac_address = eth_mac_addr, |
434 | }; | 434 | }; |
435 | 435 | ||
436 | static int rionet_setup_netdev(struct rio_mport *mport) | 436 | static int rionet_setup_netdev(struct rio_mport *mport, struct net_device *ndev) |
437 | { | 437 | { |
438 | int rc = 0; | 438 | int rc = 0; |
439 | struct net_device *ndev = NULL; | ||
440 | struct rionet_private *rnet; | 439 | struct rionet_private *rnet; |
441 | u16 device_id; | 440 | u16 device_id; |
442 | 441 | ||
443 | /* Allocate our net_device structure */ | ||
444 | ndev = alloc_etherdev(sizeof(struct rionet_private)); | ||
445 | if (ndev == NULL) { | ||
446 | printk(KERN_INFO "%s: could not allocate ethernet device.\n", | ||
447 | DRV_NAME); | ||
448 | rc = -ENOMEM; | ||
449 | goto out; | ||
450 | } | ||
451 | |||
452 | rionet_active = (struct rio_dev **)__get_free_pages(GFP_KERNEL, | 442 | rionet_active = (struct rio_dev **)__get_free_pages(GFP_KERNEL, |
453 | mport->sys_size ? __fls(sizeof(void *)) + 4 : 0); | 443 | mport->sys_size ? __fls(sizeof(void *)) + 4 : 0); |
454 | if (!rionet_active) { | 444 | if (!rionet_active) { |
@@ -504,11 +494,21 @@ static int rionet_probe(struct rio_dev *rdev, const struct rio_device_id *id) | |||
504 | int rc = -ENODEV; | 494 | int rc = -ENODEV; |
505 | u32 lpef, lsrc_ops, ldst_ops; | 495 | u32 lpef, lsrc_ops, ldst_ops; |
506 | struct rionet_peer *peer; | 496 | struct rionet_peer *peer; |
497 | struct net_device *ndev = NULL; | ||
507 | 498 | ||
508 | /* If local device is not rionet capable, give up quickly */ | 499 | /* If local device is not rionet capable, give up quickly */ |
509 | if (!rionet_capable) | 500 | if (!rionet_capable) |
510 | goto out; | 501 | goto out; |
511 | 502 | ||
503 | /* Allocate our net_device structure */ | ||
504 | ndev = alloc_etherdev(sizeof(struct rionet_private)); | ||
505 | if (ndev == NULL) { | ||
506 | printk(KERN_INFO "%s: could not allocate ethernet device.\n", | ||
507 | DRV_NAME); | ||
508 | rc = -ENOMEM; | ||
509 | goto out; | ||
510 | } | ||
511 | |||
512 | /* | 512 | /* |
513 | * First time through, make sure local device is rionet | 513 | * First time through, make sure local device is rionet |
514 | * capable, setup netdev, and set flags so this is skipped | 514 | * capable, setup netdev, and set flags so this is skipped |
@@ -529,7 +529,7 @@ static int rionet_probe(struct rio_dev *rdev, const struct rio_device_id *id) | |||
529 | goto out; | 529 | goto out; |
530 | } | 530 | } |
531 | 531 | ||
532 | rc = rionet_setup_netdev(rdev->net->hport); | 532 | rc = rionet_setup_netdev(rdev->net->hport, ndev); |
533 | rionet_check = 1; | 533 | rionet_check = 1; |
534 | } | 534 | } |
535 | 535 | ||
@@ -546,6 +546,8 @@ static int rionet_probe(struct rio_dev *rdev, const struct rio_device_id *id) | |||
546 | list_add_tail(&peer->node, &rionet_peers); | 546 | list_add_tail(&peer->node, &rionet_peers); |
547 | } | 547 | } |
548 | 548 | ||
549 | rio_set_drvdata(rdev, ndev); | ||
550 | |||
549 | out: | 551 | out: |
550 | return rc; | 552 | return rc; |
551 | } | 553 | } |
diff --git a/drivers/net/usb/kalmia.c b/drivers/net/usb/kalmia.c index d965fb1e013e..a9b6c63d54e4 100644 --- a/drivers/net/usb/kalmia.c +++ b/drivers/net/usb/kalmia.c | |||
@@ -100,34 +100,42 @@ kalmia_send_init_packet(struct usbnet *dev, u8 *init_msg, u8 init_msg_len, | |||
100 | static int | 100 | static int |
101 | kalmia_init_and_get_ethernet_addr(struct usbnet *dev, u8 *ethernet_addr) | 101 | kalmia_init_and_get_ethernet_addr(struct usbnet *dev, u8 *ethernet_addr) |
102 | { | 102 | { |
103 | char init_msg_1[] = | 103 | const static char init_msg_1[] = |
104 | { 0x57, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, | 104 | { 0x57, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, |
105 | 0x00, 0x00 }; | 105 | 0x00, 0x00 }; |
106 | char init_msg_2[] = | 106 | const static char init_msg_2[] = |
107 | { 0x57, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf4, | 107 | { 0x57, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf4, |
108 | 0x00, 0x00 }; | 108 | 0x00, 0x00 }; |
109 | char receive_buf[28]; | 109 | const static int buflen = 28; |
110 | char *usb_buf; | ||
110 | int status; | 111 | int status; |
111 | 112 | ||
112 | status = kalmia_send_init_packet(dev, init_msg_1, sizeof(init_msg_1) | 113 | usb_buf = kmalloc(buflen, GFP_DMA | GFP_KERNEL); |
113 | / sizeof(init_msg_1[0]), receive_buf, 24); | 114 | if (!usb_buf) |
115 | return -ENOMEM; | ||
116 | |||
117 | memcpy(usb_buf, init_msg_1, 12); | ||
118 | status = kalmia_send_init_packet(dev, usb_buf, sizeof(init_msg_1) | ||
119 | / sizeof(init_msg_1[0]), usb_buf, 24); | ||
114 | if (status != 0) | 120 | if (status != 0) |
115 | return status; | 121 | return status; |
116 | 122 | ||
117 | status = kalmia_send_init_packet(dev, init_msg_2, sizeof(init_msg_2) | 123 | memcpy(usb_buf, init_msg_2, 12); |
118 | / sizeof(init_msg_2[0]), receive_buf, 28); | 124 | status = kalmia_send_init_packet(dev, usb_buf, sizeof(init_msg_2) |
125 | / sizeof(init_msg_2[0]), usb_buf, 28); | ||
119 | if (status != 0) | 126 | if (status != 0) |
120 | return status; | 127 | return status; |
121 | 128 | ||
122 | memcpy(ethernet_addr, receive_buf + 10, ETH_ALEN); | 129 | memcpy(ethernet_addr, usb_buf + 10, ETH_ALEN); |
123 | 130 | ||
131 | kfree(usb_buf); | ||
124 | return status; | 132 | return status; |
125 | } | 133 | } |
126 | 134 | ||
127 | static int | 135 | static int |
128 | kalmia_bind(struct usbnet *dev, struct usb_interface *intf) | 136 | kalmia_bind(struct usbnet *dev, struct usb_interface *intf) |
129 | { | 137 | { |
130 | u8 status; | 138 | int status; |
131 | u8 ethernet_addr[ETH_ALEN]; | 139 | u8 ethernet_addr[ETH_ALEN]; |
132 | 140 | ||
133 | /* Don't bind to AT command interface */ | 141 | /* Don't bind to AT command interface */ |
@@ -190,7 +198,8 @@ kalmia_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) | |||
190 | dev_kfree_skb_any(skb); | 198 | dev_kfree_skb_any(skb); |
191 | skb = skb2; | 199 | skb = skb2; |
192 | 200 | ||
193 | done: header_start = skb_push(skb, KALMIA_HEADER_LENGTH); | 201 | done: |
202 | header_start = skb_push(skb, KALMIA_HEADER_LENGTH); | ||
194 | ether_type_1 = header_start[KALMIA_HEADER_LENGTH + 12]; | 203 | ether_type_1 = header_start[KALMIA_HEADER_LENGTH + 12]; |
195 | ether_type_2 = header_start[KALMIA_HEADER_LENGTH + 13]; | 204 | ether_type_2 = header_start[KALMIA_HEADER_LENGTH + 13]; |
196 | 205 | ||
@@ -201,9 +210,8 @@ kalmia_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) | |||
201 | header_start[0] = 0x57; | 210 | header_start[0] = 0x57; |
202 | header_start[1] = 0x44; | 211 | header_start[1] = 0x44; |
203 | content_len = skb->len - KALMIA_HEADER_LENGTH; | 212 | content_len = skb->len - KALMIA_HEADER_LENGTH; |
204 | header_start[2] = (content_len & 0xff); /* low byte */ | ||
205 | header_start[3] = (content_len >> 8); /* high byte */ | ||
206 | 213 | ||
214 | put_unaligned_le16(content_len, &header_start[2]); | ||
207 | header_start[4] = ether_type_1; | 215 | header_start[4] = ether_type_1; |
208 | header_start[5] = ether_type_2; | 216 | header_start[5] = ether_type_2; |
209 | 217 | ||
@@ -231,13 +239,13 @@ kalmia_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | |||
231 | * Our task here is to strip off framing, leaving skb with one | 239 | * Our task here is to strip off framing, leaving skb with one |
232 | * data frame for the usbnet framework code to process. | 240 | * data frame for the usbnet framework code to process. |
233 | */ | 241 | */ |
234 | const u8 HEADER_END_OF_USB_PACKET[] = | 242 | const static u8 HEADER_END_OF_USB_PACKET[] = |
235 | { 0x57, 0x5a, 0x00, 0x00, 0x08, 0x00 }; | 243 | { 0x57, 0x5a, 0x00, 0x00, 0x08, 0x00 }; |
236 | const u8 EXPECTED_UNKNOWN_HEADER_1[] = | 244 | const static u8 EXPECTED_UNKNOWN_HEADER_1[] = |
237 | { 0x57, 0x43, 0x1e, 0x00, 0x15, 0x02 }; | 245 | { 0x57, 0x43, 0x1e, 0x00, 0x15, 0x02 }; |
238 | const u8 EXPECTED_UNKNOWN_HEADER_2[] = | 246 | const static u8 EXPECTED_UNKNOWN_HEADER_2[] = |
239 | { 0x57, 0x50, 0x0e, 0x00, 0x00, 0x00 }; | 247 | { 0x57, 0x50, 0x0e, 0x00, 0x00, 0x00 }; |
240 | u8 i = 0; | 248 | int i = 0; |
241 | 249 | ||
242 | /* incomplete header? */ | 250 | /* incomplete header? */ |
243 | if (skb->len < KALMIA_HEADER_LENGTH) | 251 | if (skb->len < KALMIA_HEADER_LENGTH) |
@@ -285,7 +293,7 @@ kalmia_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | |||
285 | 293 | ||
286 | /* subtract start header and end header */ | 294 | /* subtract start header and end header */ |
287 | usb_packet_length = skb->len - (2 * KALMIA_HEADER_LENGTH); | 295 | usb_packet_length = skb->len - (2 * KALMIA_HEADER_LENGTH); |
288 | ether_packet_length = header_start[2] + (header_start[3] << 8); | 296 | ether_packet_length = get_unaligned_le16(&header_start[2]); |
289 | skb_pull(skb, KALMIA_HEADER_LENGTH); | 297 | skb_pull(skb, KALMIA_HEADER_LENGTH); |
290 | 298 | ||
291 | /* Some small packets misses end marker */ | 299 | /* Some small packets misses end marker */ |
diff --git a/drivers/net/usb/zaurus.c b/drivers/net/usb/zaurus.c index 241756e0e86f..1a2234c20514 100644 --- a/drivers/net/usb/zaurus.c +++ b/drivers/net/usb/zaurus.c | |||
@@ -331,17 +331,7 @@ static const struct usb_device_id products [] = { | |||
331 | ZAURUS_MASTER_INTERFACE, | 331 | ZAURUS_MASTER_INTERFACE, |
332 | .driver_info = ZAURUS_PXA_INFO, | 332 | .driver_info = ZAURUS_PXA_INFO, |
333 | }, | 333 | }, |
334 | |||
335 | |||
336 | /* At least some of the newest PXA units have very different lies about | ||
337 | * their standards support: they claim to be cell phones offering | ||
338 | * direct access to their radios! (No, they don't conform to CDC MDLM.) | ||
339 | */ | ||
340 | { | 334 | { |
341 | USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM, | ||
342 | USB_CDC_PROTO_NONE), | ||
343 | .driver_info = (unsigned long) &bogus_mdlm_info, | ||
344 | }, { | ||
345 | /* Motorola MOTOMAGX phones */ | 335 | /* Motorola MOTOMAGX phones */ |
346 | USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6425, USB_CLASS_COMM, | 336 | USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6425, USB_CLASS_COMM, |
347 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | 337 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), |
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index 2c1473686abe..fabcded7c6a0 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c | |||
@@ -573,7 +573,7 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx, | |||
573 | struct vmxnet3_cmd_ring *ring = &rq->rx_ring[ring_idx]; | 573 | struct vmxnet3_cmd_ring *ring = &rq->rx_ring[ring_idx]; |
574 | u32 val; | 574 | u32 val; |
575 | 575 | ||
576 | while (num_allocated < num_to_alloc) { | 576 | while (num_allocated <= num_to_alloc) { |
577 | struct vmxnet3_rx_buf_info *rbi; | 577 | struct vmxnet3_rx_buf_info *rbi; |
578 | union Vmxnet3_GenericDesc *gd; | 578 | union Vmxnet3_GenericDesc *gd; |
579 | 579 | ||
@@ -619,9 +619,15 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx, | |||
619 | 619 | ||
620 | BUG_ON(rbi->dma_addr == 0); | 620 | BUG_ON(rbi->dma_addr == 0); |
621 | gd->rxd.addr = cpu_to_le64(rbi->dma_addr); | 621 | gd->rxd.addr = cpu_to_le64(rbi->dma_addr); |
622 | gd->dword[2] = cpu_to_le32((ring->gen << VMXNET3_RXD_GEN_SHIFT) | 622 | gd->dword[2] = cpu_to_le32((!ring->gen << VMXNET3_RXD_GEN_SHIFT) |
623 | | val | rbi->len); | 623 | | val | rbi->len); |
624 | 624 | ||
625 | /* Fill the last buffer but dont mark it ready, or else the | ||
626 | * device will think that the queue is full */ | ||
627 | if (num_allocated == num_to_alloc) | ||
628 | break; | ||
629 | |||
630 | gd->dword[2] |= cpu_to_le32(ring->gen << VMXNET3_RXD_GEN_SHIFT); | ||
625 | num_allocated++; | 631 | num_allocated++; |
626 | vmxnet3_cmd_ring_adv_next2fill(ring); | 632 | vmxnet3_cmd_ring_adv_next2fill(ring); |
627 | } | 633 | } |
@@ -1138,6 +1144,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
1138 | VMXNET3_REG_RXPROD, VMXNET3_REG_RXPROD2 | 1144 | VMXNET3_REG_RXPROD, VMXNET3_REG_RXPROD2 |
1139 | }; | 1145 | }; |
1140 | u32 num_rxd = 0; | 1146 | u32 num_rxd = 0; |
1147 | bool skip_page_frags = false; | ||
1141 | struct Vmxnet3_RxCompDesc *rcd; | 1148 | struct Vmxnet3_RxCompDesc *rcd; |
1142 | struct vmxnet3_rx_ctx *ctx = &rq->rx_ctx; | 1149 | struct vmxnet3_rx_ctx *ctx = &rq->rx_ctx; |
1143 | #ifdef __BIG_ENDIAN_BITFIELD | 1150 | #ifdef __BIG_ENDIAN_BITFIELD |
@@ -1148,11 +1155,12 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
1148 | &rxComp); | 1155 | &rxComp); |
1149 | while (rcd->gen == rq->comp_ring.gen) { | 1156 | while (rcd->gen == rq->comp_ring.gen) { |
1150 | struct vmxnet3_rx_buf_info *rbi; | 1157 | struct vmxnet3_rx_buf_info *rbi; |
1151 | struct sk_buff *skb; | 1158 | struct sk_buff *skb, *new_skb = NULL; |
1159 | struct page *new_page = NULL; | ||
1152 | int num_to_alloc; | 1160 | int num_to_alloc; |
1153 | struct Vmxnet3_RxDesc *rxd; | 1161 | struct Vmxnet3_RxDesc *rxd; |
1154 | u32 idx, ring_idx; | 1162 | u32 idx, ring_idx; |
1155 | 1163 | struct vmxnet3_cmd_ring *ring = NULL; | |
1156 | if (num_rxd >= quota) { | 1164 | if (num_rxd >= quota) { |
1157 | /* we may stop even before we see the EOP desc of | 1165 | /* we may stop even before we see the EOP desc of |
1158 | * the current pkt | 1166 | * the current pkt |
@@ -1163,6 +1171,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
1163 | BUG_ON(rcd->rqID != rq->qid && rcd->rqID != rq->qid2); | 1171 | BUG_ON(rcd->rqID != rq->qid && rcd->rqID != rq->qid2); |
1164 | idx = rcd->rxdIdx; | 1172 | idx = rcd->rxdIdx; |
1165 | ring_idx = rcd->rqID < adapter->num_rx_queues ? 0 : 1; | 1173 | ring_idx = rcd->rqID < adapter->num_rx_queues ? 0 : 1; |
1174 | ring = rq->rx_ring + ring_idx; | ||
1166 | vmxnet3_getRxDesc(rxd, &rq->rx_ring[ring_idx].base[idx].rxd, | 1175 | vmxnet3_getRxDesc(rxd, &rq->rx_ring[ring_idx].base[idx].rxd, |
1167 | &rxCmdDesc); | 1176 | &rxCmdDesc); |
1168 | rbi = rq->buf_info[ring_idx] + idx; | 1177 | rbi = rq->buf_info[ring_idx] + idx; |
@@ -1191,37 +1200,80 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
1191 | goto rcd_done; | 1200 | goto rcd_done; |
1192 | } | 1201 | } |
1193 | 1202 | ||
1203 | skip_page_frags = false; | ||
1194 | ctx->skb = rbi->skb; | 1204 | ctx->skb = rbi->skb; |
1195 | rbi->skb = NULL; | 1205 | new_skb = dev_alloc_skb(rbi->len + NET_IP_ALIGN); |
1206 | if (new_skb == NULL) { | ||
1207 | /* Skb allocation failed, do not handover this | ||
1208 | * skb to stack. Reuse it. Drop the existing pkt | ||
1209 | */ | ||
1210 | rq->stats.rx_buf_alloc_failure++; | ||
1211 | ctx->skb = NULL; | ||
1212 | rq->stats.drop_total++; | ||
1213 | skip_page_frags = true; | ||
1214 | goto rcd_done; | ||
1215 | } | ||
1196 | 1216 | ||
1197 | pci_unmap_single(adapter->pdev, rbi->dma_addr, rbi->len, | 1217 | pci_unmap_single(adapter->pdev, rbi->dma_addr, rbi->len, |
1198 | PCI_DMA_FROMDEVICE); | 1218 | PCI_DMA_FROMDEVICE); |
1199 | 1219 | ||
1200 | skb_put(ctx->skb, rcd->len); | 1220 | skb_put(ctx->skb, rcd->len); |
1221 | |||
1222 | /* Immediate refill */ | ||
1223 | new_skb->dev = adapter->netdev; | ||
1224 | skb_reserve(new_skb, NET_IP_ALIGN); | ||
1225 | rbi->skb = new_skb; | ||
1226 | rbi->dma_addr = pci_map_single(adapter->pdev, | ||
1227 | rbi->skb->data, rbi->len, | ||
1228 | PCI_DMA_FROMDEVICE); | ||
1229 | rxd->addr = cpu_to_le64(rbi->dma_addr); | ||
1230 | rxd->len = rbi->len; | ||
1231 | |||
1201 | } else { | 1232 | } else { |
1202 | BUG_ON(ctx->skb == NULL); | 1233 | BUG_ON(ctx->skb == NULL && !skip_page_frags); |
1234 | |||
1203 | /* non SOP buffer must be type 1 in most cases */ | 1235 | /* non SOP buffer must be type 1 in most cases */ |
1204 | if (rbi->buf_type == VMXNET3_RX_BUF_PAGE) { | 1236 | BUG_ON(rbi->buf_type != VMXNET3_RX_BUF_PAGE); |
1205 | BUG_ON(rxd->btype != VMXNET3_RXD_BTYPE_BODY); | 1237 | BUG_ON(rxd->btype != VMXNET3_RXD_BTYPE_BODY); |
1206 | 1238 | ||
1207 | if (rcd->len) { | 1239 | /* If an sop buffer was dropped, skip all |
1208 | pci_unmap_page(adapter->pdev, | 1240 | * following non-sop fragments. They will be reused. |
1209 | rbi->dma_addr, rbi->len, | 1241 | */ |
1210 | PCI_DMA_FROMDEVICE); | 1242 | if (skip_page_frags) |
1243 | goto rcd_done; | ||
1211 | 1244 | ||
1212 | vmxnet3_append_frag(ctx->skb, rcd, rbi); | 1245 | new_page = alloc_page(GFP_ATOMIC); |
1213 | rbi->page = NULL; | 1246 | if (unlikely(new_page == NULL)) { |
1214 | } | 1247 | /* Replacement page frag could not be allocated. |
1215 | } else { | 1248 | * Reuse this page. Drop the pkt and free the |
1216 | /* | 1249 | * skb which contained this page as a frag. Skip |
1217 | * The only time a non-SOP buffer is type 0 is | 1250 | * processing all the following non-sop frags. |
1218 | * when it's EOP and error flag is raised, which | ||
1219 | * has already been handled. | ||
1220 | */ | 1251 | */ |
1221 | BUG_ON(true); | 1252 | rq->stats.rx_buf_alloc_failure++; |
1253 | dev_kfree_skb(ctx->skb); | ||
1254 | ctx->skb = NULL; | ||
1255 | skip_page_frags = true; | ||
1256 | goto rcd_done; | ||
1257 | } | ||
1258 | |||
1259 | if (rcd->len) { | ||
1260 | pci_unmap_page(adapter->pdev, | ||
1261 | rbi->dma_addr, rbi->len, | ||
1262 | PCI_DMA_FROMDEVICE); | ||
1263 | |||
1264 | vmxnet3_append_frag(ctx->skb, rcd, rbi); | ||
1222 | } | 1265 | } |
1266 | |||
1267 | /* Immediate refill */ | ||
1268 | rbi->page = new_page; | ||
1269 | rbi->dma_addr = pci_map_page(adapter->pdev, rbi->page, | ||
1270 | 0, PAGE_SIZE, | ||
1271 | PCI_DMA_FROMDEVICE); | ||
1272 | rxd->addr = cpu_to_le64(rbi->dma_addr); | ||
1273 | rxd->len = rbi->len; | ||
1223 | } | 1274 | } |
1224 | 1275 | ||
1276 | |||
1225 | skb = ctx->skb; | 1277 | skb = ctx->skb; |
1226 | if (rcd->eop) { | 1278 | if (rcd->eop) { |
1227 | skb->len += skb->data_len; | 1279 | skb->len += skb->data_len; |
@@ -1243,26 +1295,27 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
1243 | } | 1295 | } |
1244 | 1296 | ||
1245 | rcd_done: | 1297 | rcd_done: |
1246 | /* device may skip some rx descs */ | 1298 | /* device may have skipped some rx descs */ |
1247 | rq->rx_ring[ring_idx].next2comp = idx; | 1299 | ring->next2comp = idx; |
1248 | VMXNET3_INC_RING_IDX_ONLY(rq->rx_ring[ring_idx].next2comp, | 1300 | num_to_alloc = vmxnet3_cmd_ring_desc_avail(ring); |
1249 | rq->rx_ring[ring_idx].size); | 1301 | ring = rq->rx_ring + ring_idx; |
1250 | 1302 | while (num_to_alloc) { | |
1251 | /* refill rx buffers frequently to avoid starving the h/w */ | 1303 | vmxnet3_getRxDesc(rxd, &ring->base[ring->next2fill].rxd, |
1252 | num_to_alloc = vmxnet3_cmd_ring_desc_avail(rq->rx_ring + | 1304 | &rxCmdDesc); |
1253 | ring_idx); | 1305 | BUG_ON(!rxd->addr); |
1254 | if (unlikely(num_to_alloc > VMXNET3_RX_ALLOC_THRESHOLD(rq, | 1306 | |
1255 | ring_idx, adapter))) { | 1307 | /* Recv desc is ready to be used by the device */ |
1256 | vmxnet3_rq_alloc_rx_buf(rq, ring_idx, num_to_alloc, | 1308 | rxd->gen = ring->gen; |
1257 | adapter); | 1309 | vmxnet3_cmd_ring_adv_next2fill(ring); |
1258 | 1310 | num_to_alloc--; | |
1259 | /* if needed, update the register */ | 1311 | } |
1260 | if (unlikely(rq->shared->updateRxProd)) { | 1312 | |
1261 | VMXNET3_WRITE_BAR0_REG(adapter, | 1313 | /* if needed, update the register */ |
1262 | rxprod_reg[ring_idx] + rq->qid * 8, | 1314 | if (unlikely(rq->shared->updateRxProd)) { |
1263 | rq->rx_ring[ring_idx].next2fill); | 1315 | VMXNET3_WRITE_BAR0_REG(adapter, |
1264 | rq->uncommitted[ring_idx] = 0; | 1316 | rxprod_reg[ring_idx] + rq->qid * 8, |
1265 | } | 1317 | ring->next2fill); |
1318 | rq->uncommitted[ring_idx] = 0; | ||
1266 | } | 1319 | } |
1267 | 1320 | ||
1268 | vmxnet3_comp_ring_adv_next2proc(&rq->comp_ring); | 1321 | vmxnet3_comp_ring_adv_next2proc(&rq->comp_ring); |
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h index 2e37985809d2..a9cb3fabb17f 100644 --- a/drivers/net/vmxnet3/vmxnet3_int.h +++ b/drivers/net/vmxnet3/vmxnet3_int.h | |||
@@ -69,10 +69,10 @@ | |||
69 | /* | 69 | /* |
70 | * Version numbers | 70 | * Version numbers |
71 | */ | 71 | */ |
72 | #define VMXNET3_DRIVER_VERSION_STRING "1.1.9.0-k" | 72 | #define VMXNET3_DRIVER_VERSION_STRING "1.1.14.0-k" |
73 | 73 | ||
74 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ | 74 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ |
75 | #define VMXNET3_DRIVER_VERSION_NUM 0x01010900 | 75 | #define VMXNET3_DRIVER_VERSION_NUM 0x01010E00 |
76 | 76 | ||
77 | #if defined(CONFIG_PCI_MSI) | 77 | #if defined(CONFIG_PCI_MSI) |
78 | /* RSS only makes sense if MSI-X is supported. */ | 78 | /* RSS only makes sense if MSI-X is supported. */ |
diff --git a/drivers/net/wireless/ath/ath5k/eeprom.c b/drivers/net/wireless/ath/ath5k/eeprom.c index 1fef84f87c78..392771f93759 100644 --- a/drivers/net/wireless/ath/ath5k/eeprom.c +++ b/drivers/net/wireless/ath/ath5k/eeprom.c | |||
@@ -691,14 +691,12 @@ ath5k_eeprom_free_pcal_info(struct ath5k_hw *ah, int mode) | |||
691 | if (!chinfo[pier].pd_curves) | 691 | if (!chinfo[pier].pd_curves) |
692 | continue; | 692 | continue; |
693 | 693 | ||
694 | for (pdg = 0; pdg < ee->ee_pd_gains[mode]; pdg++) { | 694 | for (pdg = 0; pdg < AR5K_EEPROM_N_PD_CURVES; pdg++) { |
695 | struct ath5k_pdgain_info *pd = | 695 | struct ath5k_pdgain_info *pd = |
696 | &chinfo[pier].pd_curves[pdg]; | 696 | &chinfo[pier].pd_curves[pdg]; |
697 | 697 | ||
698 | if (pd != NULL) { | 698 | kfree(pd->pd_step); |
699 | kfree(pd->pd_step); | 699 | kfree(pd->pd_pwr); |
700 | kfree(pd->pd_pwr); | ||
701 | } | ||
702 | } | 700 | } |
703 | 701 | ||
704 | kfree(chinfo[pier].pd_curves); | 702 | kfree(chinfo[pier].pd_curves); |
diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c index b8cbfc707213..3bad0b2cf9a3 100644 --- a/drivers/net/wireless/ath/ath9k/pci.c +++ b/drivers/net/wireless/ath/ath9k/pci.c | |||
@@ -278,6 +278,12 @@ static int ath_pci_suspend(struct device *device) | |||
278 | 278 | ||
279 | ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); | 279 | ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); |
280 | 280 | ||
281 | /* The device has to be moved to FULLSLEEP forcibly. | ||
282 | * Otherwise the chip never moved to full sleep, | ||
283 | * when no interface is up. | ||
284 | */ | ||
285 | ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP); | ||
286 | |||
281 | return 0; | 287 | return 0; |
282 | } | 288 | } |
283 | 289 | ||