diff options
| -rw-r--r-- | Documentation/networking/ip-sysctl.txt | 8 | ||||
| -rw-r--r-- | MAINTAINERS | 4 | ||||
| -rw-r--r-- | drivers/net/e1000/e1000_main.c | 19 | ||||
| -rw-r--r-- | drivers/net/tc35815.c | 1 | ||||
| -rw-r--r-- | drivers/net/usb/cdc_ether.c | 5 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-5000.c | 8 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.h | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-tx.c | 22 | ||||
| -rw-r--r-- | net/core/dev.c | 2 |
11 files changed, 57 insertions, 18 deletions
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index 006b39dec87d..e87f3cdc8a6a 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt | |||
| @@ -1074,10 +1074,10 @@ regen_max_retry - INTEGER | |||
| 1074 | Default: 5 | 1074 | Default: 5 |
| 1075 | 1075 | ||
| 1076 | max_addresses - INTEGER | 1076 | max_addresses - INTEGER |
| 1077 | Number of maximum addresses per interface. 0 disables limitation. | 1077 | Maximum number of autoconfigured addresses per interface. Setting |
| 1078 | It is recommended not set too large value (or 0) because it would | 1078 | to zero disables the limitation. It is not recommended to set this |
| 1079 | be too easy way to crash kernel to allow to create too much of | 1079 | value too large (or to zero) because it would be an easy way to |
| 1080 | autoconfigured addresses. | 1080 | crash the kernel by allowing too many addresses to be created. |
| 1081 | Default: 16 | 1081 | Default: 16 |
| 1082 | 1082 | ||
| 1083 | disable_ipv6 - BOOLEAN | 1083 | disable_ipv6 - BOOLEAN |
diff --git a/MAINTAINERS b/MAINTAINERS index c95f727236e1..2533fc45a44a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -3489,9 +3489,9 @@ S: Maintained | |||
| 3489 | F: drivers/net/wireless/libertas/ | 3489 | F: drivers/net/wireless/libertas/ |
| 3490 | 3490 | ||
| 3491 | MARVELL MV643XX ETHERNET DRIVER | 3491 | MARVELL MV643XX ETHERNET DRIVER |
| 3492 | M: Lennert Buytenhek <buytenh@marvell.com> | 3492 | M: Lennert Buytenhek <buytenh@wantstofly.org> |
| 3493 | L: netdev@vger.kernel.org | 3493 | L: netdev@vger.kernel.org |
| 3494 | S: Supported | 3494 | S: Maintained |
| 3495 | F: drivers/net/mv643xx_eth.* | 3495 | F: drivers/net/mv643xx_eth.* |
| 3496 | F: include/linux/mv643xx.h | 3496 | F: include/linux/mv643xx.h |
| 3497 | 3497 | ||
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index d29bb532eccf..765543663a4f 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
| @@ -4006,11 +4006,21 @@ check_page: | |||
| 4006 | } | 4006 | } |
| 4007 | } | 4007 | } |
| 4008 | 4008 | ||
| 4009 | if (!buffer_info->dma) | 4009 | if (!buffer_info->dma) { |
| 4010 | buffer_info->dma = pci_map_page(pdev, | 4010 | buffer_info->dma = pci_map_page(pdev, |
| 4011 | buffer_info->page, 0, | 4011 | buffer_info->page, 0, |
| 4012 | buffer_info->length, | 4012 | buffer_info->length, |
| 4013 | PCI_DMA_FROMDEVICE); | 4013 | PCI_DMA_FROMDEVICE); |
| 4014 | if (pci_dma_mapping_error(pdev, buffer_info->dma)) { | ||
| 4015 | put_page(buffer_info->page); | ||
| 4016 | dev_kfree_skb(skb); | ||
| 4017 | buffer_info->page = NULL; | ||
| 4018 | buffer_info->skb = NULL; | ||
| 4019 | buffer_info->dma = 0; | ||
| 4020 | adapter->alloc_rx_buff_failed++; | ||
| 4021 | break; /* while !buffer_info->skb */ | ||
| 4022 | } | ||
| 4023 | } | ||
| 4014 | 4024 | ||
| 4015 | rx_desc = E1000_RX_DESC(*rx_ring, i); | 4025 | rx_desc = E1000_RX_DESC(*rx_ring, i); |
| 4016 | rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma); | 4026 | rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma); |
| @@ -4101,6 +4111,13 @@ map_skb: | |||
| 4101 | skb->data, | 4111 | skb->data, |
| 4102 | buffer_info->length, | 4112 | buffer_info->length, |
| 4103 | PCI_DMA_FROMDEVICE); | 4113 | PCI_DMA_FROMDEVICE); |
| 4114 | if (pci_dma_mapping_error(pdev, buffer_info->dma)) { | ||
| 4115 | dev_kfree_skb(skb); | ||
| 4116 | buffer_info->skb = NULL; | ||
| 4117 | buffer_info->dma = 0; | ||
| 4118 | adapter->alloc_rx_buff_failed++; | ||
| 4119 | break; /* while !buffer_info->skb */ | ||
| 4120 | } | ||
| 4104 | 4121 | ||
| 4105 | /* | 4122 | /* |
| 4106 | * XXX if it was allocated cleanly it will never map to a | 4123 | * XXX if it was allocated cleanly it will never map to a |
diff --git a/drivers/net/tc35815.c b/drivers/net/tc35815.c index 75a669d48e5e..d71c1976072e 100644 --- a/drivers/net/tc35815.c +++ b/drivers/net/tc35815.c | |||
| @@ -1437,7 +1437,6 @@ static int tc35815_do_interrupt(struct net_device *dev, u32 status, int limit) | |||
| 1437 | /* Transmit complete. */ | 1437 | /* Transmit complete. */ |
| 1438 | lp->lstats.tx_ints++; | 1438 | lp->lstats.tx_ints++; |
| 1439 | tc35815_txdone(dev); | 1439 | tc35815_txdone(dev); |
| 1440 | netif_wake_queue(dev); | ||
| 1441 | if (ret < 0) | 1440 | if (ret < 0) |
| 1442 | ret = 0; | 1441 | ret = 0; |
| 1443 | } | 1442 | } |
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 4f27f022fbf7..5f3b9eaeb04f 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c | |||
| @@ -584,6 +584,11 @@ static const struct usb_device_id products [] = { | |||
| 584 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | 584 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), |
| 585 | .driver_info = (unsigned long) &mbm_info, | 585 | .driver_info = (unsigned long) &mbm_info, |
| 586 | }, { | 586 | }, { |
| 587 | /* Ericsson C3607w ver 2 */ | ||
| 588 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x190b, USB_CLASS_COMM, | ||
| 589 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
| 590 | .driver_info = (unsigned long) &mbm_info, | ||
| 591 | }, { | ||
| 587 | /* Toshiba F3507g */ | 592 | /* Toshiba F3507g */ |
| 588 | USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130b, USB_CLASS_COMM, | 593 | USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130b, USB_CLASS_COMM, |
| 589 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | 594 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index 9b4b8b5c7574..31462813bac0 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
| @@ -2008,7 +2008,7 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv, | |||
| 2008 | IWL_DEBUG_TX_REPLY(priv, "Retry scheduler reclaim scd_ssn " | 2008 | IWL_DEBUG_TX_REPLY(priv, "Retry scheduler reclaim scd_ssn " |
| 2009 | "%d index %d\n", scd_ssn , index); | 2009 | "%d index %d\n", scd_ssn , index); |
| 2010 | freed = iwl_tx_queue_reclaim(priv, txq_id, index); | 2010 | freed = iwl_tx_queue_reclaim(priv, txq_id, index); |
| 2011 | priv->stations[sta_id].tid[tid].tfds_in_queue -= freed; | 2011 | iwl_free_tfds_in_queue(priv, sta_id, tid, freed); |
| 2012 | 2012 | ||
| 2013 | if (priv->mac80211_registered && | 2013 | if (priv->mac80211_registered && |
| 2014 | (iwl_queue_space(&txq->q) > txq->q.low_mark) && | 2014 | (iwl_queue_space(&txq->q) > txq->q.low_mark) && |
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index de45f308b744..cffaae772d51 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
| @@ -1125,7 +1125,7 @@ static void iwl5000_rx_reply_tx(struct iwl_priv *priv, | |||
| 1125 | scd_ssn , index, txq_id, txq->swq_id); | 1125 | scd_ssn , index, txq_id, txq->swq_id); |
| 1126 | 1126 | ||
| 1127 | freed = iwl_tx_queue_reclaim(priv, txq_id, index); | 1127 | freed = iwl_tx_queue_reclaim(priv, txq_id, index); |
| 1128 | priv->stations[sta_id].tid[tid].tfds_in_queue -= freed; | 1128 | iwl_free_tfds_in_queue(priv, sta_id, tid, freed); |
| 1129 | 1129 | ||
| 1130 | if (priv->mac80211_registered && | 1130 | if (priv->mac80211_registered && |
| 1131 | (iwl_queue_space(&txq->q) > txq->q.low_mark) && | 1131 | (iwl_queue_space(&txq->q) > txq->q.low_mark) && |
| @@ -1153,16 +1153,14 @@ static void iwl5000_rx_reply_tx(struct iwl_priv *priv, | |||
| 1153 | tx_resp->failure_frame); | 1153 | tx_resp->failure_frame); |
| 1154 | 1154 | ||
| 1155 | freed = iwl_tx_queue_reclaim(priv, txq_id, index); | 1155 | freed = iwl_tx_queue_reclaim(priv, txq_id, index); |
| 1156 | if (ieee80211_is_data_qos(tx_resp->frame_ctrl)) | 1156 | iwl_free_tfds_in_queue(priv, sta_id, tid, freed); |
| 1157 | priv->stations[sta_id].tid[tid].tfds_in_queue -= freed; | ||
| 1158 | 1157 | ||
| 1159 | if (priv->mac80211_registered && | 1158 | if (priv->mac80211_registered && |
| 1160 | (iwl_queue_space(&txq->q) > txq->q.low_mark)) | 1159 | (iwl_queue_space(&txq->q) > txq->q.low_mark)) |
| 1161 | iwl_wake_queue(priv, txq_id); | 1160 | iwl_wake_queue(priv, txq_id); |
| 1162 | } | 1161 | } |
| 1163 | 1162 | ||
| 1164 | if (ieee80211_is_data_qos(tx_resp->frame_ctrl)) | 1163 | iwl_txq_check_empty(priv, sta_id, tid, txq_id); |
| 1165 | iwl_txq_check_empty(priv, sta_id, tid, txq_id); | ||
| 1166 | 1164 | ||
| 1167 | if (iwl_check_bits(status, TX_ABORT_REQUIRED_MSK)) | 1165 | if (iwl_check_bits(status, TX_ABORT_REQUIRED_MSK)) |
| 1168 | IWL_ERR(priv, "TODO: Implement Tx ABORT REQUIRED!!!\n"); | 1166 | IWL_ERR(priv, "TODO: Implement Tx ABORT REQUIRED!!!\n"); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index d10bea64fce3..f36f804804fc 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
| @@ -2744,8 +2744,8 @@ int iwl_mac_config(struct ieee80211_hw *hw, u32 changed) | |||
| 2744 | if ((le16_to_cpu(priv->staging_rxon.channel) != ch)) | 2744 | if ((le16_to_cpu(priv->staging_rxon.channel) != ch)) |
| 2745 | priv->staging_rxon.flags = 0; | 2745 | priv->staging_rxon.flags = 0; |
| 2746 | 2746 | ||
| 2747 | iwl_set_rxon_ht(priv, ht_conf); | ||
| 2748 | iwl_set_rxon_channel(priv, conf->channel); | 2747 | iwl_set_rxon_channel(priv, conf->channel); |
| 2748 | iwl_set_rxon_ht(priv, ht_conf); | ||
| 2749 | 2749 | ||
| 2750 | iwl_set_flags_for_band(priv, conf->channel->band); | 2750 | iwl_set_flags_for_band(priv, conf->channel->band); |
| 2751 | spin_unlock_irqrestore(&priv->lock, flags); | 2751 | spin_unlock_irqrestore(&priv->lock, flags); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h index 27ca859e7453..b69e972671b2 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-core.h | |||
| @@ -446,6 +446,8 @@ void iwl_hw_txq_ctx_free(struct iwl_priv *priv); | |||
| 446 | int iwl_hw_tx_queue_init(struct iwl_priv *priv, | 446 | int iwl_hw_tx_queue_init(struct iwl_priv *priv, |
| 447 | struct iwl_tx_queue *txq); | 447 | struct iwl_tx_queue *txq); |
| 448 | int iwl_txq_update_write_ptr(struct iwl_priv *priv, struct iwl_tx_queue *txq); | 448 | int iwl_txq_update_write_ptr(struct iwl_priv *priv, struct iwl_tx_queue *txq); |
| 449 | void iwl_free_tfds_in_queue(struct iwl_priv *priv, | ||
| 450 | int sta_id, int tid, int freed); | ||
| 449 | int iwl_tx_queue_init(struct iwl_priv *priv, struct iwl_tx_queue *txq, | 451 | int iwl_tx_queue_init(struct iwl_priv *priv, struct iwl_tx_queue *txq, |
| 450 | int slots_num, u32 txq_id); | 452 | int slots_num, u32 txq_id); |
| 451 | void iwl_tx_queue_free(struct iwl_priv *priv, int txq_id); | 453 | void iwl_tx_queue_free(struct iwl_priv *priv, int txq_id); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c index 87ce2bd292c7..8f4071562857 100644 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | |||
| @@ -120,6 +120,20 @@ int iwl_txq_update_write_ptr(struct iwl_priv *priv, struct iwl_tx_queue *txq) | |||
| 120 | EXPORT_SYMBOL(iwl_txq_update_write_ptr); | 120 | EXPORT_SYMBOL(iwl_txq_update_write_ptr); |
| 121 | 121 | ||
| 122 | 122 | ||
| 123 | void iwl_free_tfds_in_queue(struct iwl_priv *priv, | ||
| 124 | int sta_id, int tid, int freed) | ||
| 125 | { | ||
| 126 | if (priv->stations[sta_id].tid[tid].tfds_in_queue >= freed) | ||
| 127 | priv->stations[sta_id].tid[tid].tfds_in_queue -= freed; | ||
| 128 | else { | ||
| 129 | IWL_ERR(priv, "free more than tfds_in_queue (%u:%d)\n", | ||
| 130 | priv->stations[sta_id].tid[tid].tfds_in_queue, | ||
| 131 | freed); | ||
| 132 | priv->stations[sta_id].tid[tid].tfds_in_queue = 0; | ||
| 133 | } | ||
| 134 | } | ||
| 135 | EXPORT_SYMBOL(iwl_free_tfds_in_queue); | ||
| 136 | |||
| 123 | /** | 137 | /** |
| 124 | * iwl_tx_queue_free - Deallocate DMA queue. | 138 | * iwl_tx_queue_free - Deallocate DMA queue. |
| 125 | * @txq: Transmit queue to deallocate. | 139 | * @txq: Transmit queue to deallocate. |
| @@ -1131,6 +1145,7 @@ int iwl_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index) | |||
| 1131 | struct iwl_queue *q = &txq->q; | 1145 | struct iwl_queue *q = &txq->q; |
| 1132 | struct iwl_tx_info *tx_info; | 1146 | struct iwl_tx_info *tx_info; |
| 1133 | int nfreed = 0; | 1147 | int nfreed = 0; |
| 1148 | struct ieee80211_hdr *hdr; | ||
| 1134 | 1149 | ||
| 1135 | if ((index >= q->n_bd) || (iwl_queue_used(q, index) == 0)) { | 1150 | if ((index >= q->n_bd) || (iwl_queue_used(q, index) == 0)) { |
| 1136 | IWL_ERR(priv, "Read index for DMA queue txq id (%d), index %d, " | 1151 | IWL_ERR(priv, "Read index for DMA queue txq id (%d), index %d, " |
| @@ -1145,13 +1160,16 @@ int iwl_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index) | |||
| 1145 | 1160 | ||
| 1146 | tx_info = &txq->txb[txq->q.read_ptr]; | 1161 | tx_info = &txq->txb[txq->q.read_ptr]; |
| 1147 | iwl_tx_status(priv, tx_info->skb[0]); | 1162 | iwl_tx_status(priv, tx_info->skb[0]); |
| 1163 | |||
| 1164 | hdr = (struct ieee80211_hdr *)tx_info->skb[0]->data; | ||
| 1165 | if (hdr && ieee80211_is_data_qos(hdr->frame_control)) | ||
| 1166 | nfreed++; | ||
| 1148 | tx_info->skb[0] = NULL; | 1167 | tx_info->skb[0] = NULL; |
| 1149 | 1168 | ||
| 1150 | if (priv->cfg->ops->lib->txq_inval_byte_cnt_tbl) | 1169 | if (priv->cfg->ops->lib->txq_inval_byte_cnt_tbl) |
| 1151 | priv->cfg->ops->lib->txq_inval_byte_cnt_tbl(priv, txq); | 1170 | priv->cfg->ops->lib->txq_inval_byte_cnt_tbl(priv, txq); |
| 1152 | 1171 | ||
| 1153 | priv->cfg->ops->lib->txq_free_tfd(priv, txq); | 1172 | priv->cfg->ops->lib->txq_free_tfd(priv, txq); |
| 1154 | nfreed++; | ||
| 1155 | } | 1173 | } |
| 1156 | return nfreed; | 1174 | return nfreed; |
| 1157 | } | 1175 | } |
| @@ -1559,7 +1577,7 @@ void iwl_rx_reply_compressed_ba(struct iwl_priv *priv, | |||
| 1559 | if (txq->q.read_ptr != (ba_resp_scd_ssn & 0xff)) { | 1577 | if (txq->q.read_ptr != (ba_resp_scd_ssn & 0xff)) { |
| 1560 | /* calculate mac80211 ampdu sw queue to wake */ | 1578 | /* calculate mac80211 ampdu sw queue to wake */ |
| 1561 | int freed = iwl_tx_queue_reclaim(priv, scd_flow, index); | 1579 | int freed = iwl_tx_queue_reclaim(priv, scd_flow, index); |
| 1562 | priv->stations[sta_id].tid[tid].tfds_in_queue -= freed; | 1580 | iwl_free_tfds_in_queue(priv, sta_id, tid, freed); |
| 1563 | 1581 | ||
| 1564 | if ((iwl_queue_space(&txq->q) > txq->q.low_mark) && | 1582 | if ((iwl_queue_space(&txq->q) > txq->q.low_mark) && |
| 1565 | priv->mac80211_registered && | 1583 | priv->mac80211_registered && |
diff --git a/net/core/dev.c b/net/core/dev.c index be9924f60ec3..ec874218b206 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -2761,7 +2761,7 @@ gro_result_t napi_frags_finish(struct napi_struct *napi, struct sk_buff *skb, | |||
| 2761 | switch (ret) { | 2761 | switch (ret) { |
| 2762 | case GRO_NORMAL: | 2762 | case GRO_NORMAL: |
| 2763 | case GRO_HELD: | 2763 | case GRO_HELD: |
| 2764 | skb->protocol = eth_type_trans(skb, napi->dev); | 2764 | skb->protocol = eth_type_trans(skb, skb->dev); |
| 2765 | 2765 | ||
| 2766 | if (ret == GRO_HELD) | 2766 | if (ret == GRO_HELD) |
| 2767 | skb_gro_pull(skb, -ETH_HLEN); | 2767 | skb_gro_pull(skb, -ETH_HLEN); |
