Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(303)

Side by Side Diff: chromeos/compat-wireless/drivers/net/wireless/mwl8k.c

Issue 5326002: Update compat-wireless to 2.6.36-5-spn (Closed) Base URL: http://git.chromium.org/git/kernel.git@master
Patch Set: Fixes for !ACK handling, missing local changes, log message fixes Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * drivers/net/wireless/mwl8k.c 2 * drivers/net/wireless/mwl8k.c
3 * Driver for Marvell TOPDOG 802.11 Wireless cards 3 * Driver for Marvell TOPDOG 802.11 Wireless cards
4 * 4 *
5 * Copyright (C) 2008, 2009, 2010 Marvell Semiconductor Inc. 5 * Copyright (C) 2008, 2009, 2010 Marvell Semiconductor Inc.
6 * 6 *
7 * This file is licensed under the terms of the GNU General Public 7 * This file is licensed under the terms of the GNU General Public
8 * License version 2. This program is licensed "as is" without any 8 * License version 2. This program is licensed "as is" without any
9 * warranty of any kind, whether express or implied. 9 * warranty of any kind, whether express or implied.
10 */ 10 */
(...skipping 892 matching lines...) Expand 10 before | Expand all | Expand 10 after
903 int i; 903 int i;
904 904
905 rxq->rxd_count = 0; 905 rxq->rxd_count = 0;
906 rxq->head = 0; 906 rxq->head = 0;
907 rxq->tail = 0; 907 rxq->tail = 0;
908 908
909 size = MWL8K_RX_DESCS * priv->rxd_ops->rxd_size; 909 size = MWL8K_RX_DESCS * priv->rxd_ops->rxd_size;
910 910
911 rxq->rxd = pci_alloc_consistent(priv->pdev, size, &rxq->rxd_dma); 911 rxq->rxd = pci_alloc_consistent(priv->pdev, size, &rxq->rxd_dma);
912 if (rxq->rxd == NULL) { 912 if (rxq->rxd == NULL) {
913 » » wiphy_err(hw->wiphy, "failed to alloc rx descriptors\n"); 913 » » wiphy_err(hw->wiphy, "failed to alloc RX descriptors\n");
914 return -ENOMEM; 914 return -ENOMEM;
915 } 915 }
916 memset(rxq->rxd, 0, size); 916 memset(rxq->rxd, 0, size);
917 917
918 rxq->buf = kmalloc(MWL8K_RX_DESCS * sizeof(*rxq->buf), GFP_KERNEL); 918 rxq->buf = kmalloc(MWL8K_RX_DESCS * sizeof(*rxq->buf), GFP_KERNEL);
919 if (rxq->buf == NULL) { 919 if (rxq->buf == NULL) {
920 » » wiphy_err(hw->wiphy, "failed to alloc rx skbuff list\n"); 920 » » wiphy_err(hw->wiphy, "failed to alloc RX skbuff list\n");
921 pci_free_consistent(priv->pdev, size, rxq->rxd, rxq->rxd_dma); 921 pci_free_consistent(priv->pdev, size, rxq->rxd, rxq->rxd_dma);
922 return -ENOMEM; 922 return -ENOMEM;
923 } 923 }
924 memset(rxq->buf, 0, MWL8K_RX_DESCS * sizeof(*rxq->buf)); 924 memset(rxq->buf, 0, MWL8K_RX_DESCS * sizeof(*rxq->buf));
925 925
926 for (i = 0; i < MWL8K_RX_DESCS; i++) { 926 for (i = 0; i < MWL8K_RX_DESCS; i++) {
927 int desc_size; 927 int desc_size;
928 void *rxd; 928 void *rxd;
929 int nexti; 929 int nexti;
930 dma_addr_t next_dma_addr; 930 dma_addr_t next_dma_addr;
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
1138 int i; 1138 int i;
1139 1139
1140 txq->len = 0; 1140 txq->len = 0;
1141 txq->head = 0; 1141 txq->head = 0;
1142 txq->tail = 0; 1142 txq->tail = 0;
1143 1143
1144 size = MWL8K_TX_DESCS * sizeof(struct mwl8k_tx_desc); 1144 size = MWL8K_TX_DESCS * sizeof(struct mwl8k_tx_desc);
1145 1145
1146 txq->txd = pci_alloc_consistent(priv->pdev, size, &txq->txd_dma); 1146 txq->txd = pci_alloc_consistent(priv->pdev, size, &txq->txd_dma);
1147 if (txq->txd == NULL) { 1147 if (txq->txd == NULL) {
1148 » » wiphy_err(hw->wiphy, "failed to alloc tx descriptors\n"); 1148 » » wiphy_err(hw->wiphy, "failed to alloc TX descriptors\n");
1149 return -ENOMEM; 1149 return -ENOMEM;
1150 } 1150 }
1151 memset(txq->txd, 0, size); 1151 memset(txq->txd, 0, size);
1152 1152
1153 txq->skb = kmalloc(MWL8K_TX_DESCS * sizeof(*txq->skb), GFP_KERNEL); 1153 txq->skb = kmalloc(MWL8K_TX_DESCS * sizeof(*txq->skb), GFP_KERNEL);
1154 if (txq->skb == NULL) { 1154 if (txq->skb == NULL) {
1155 » » wiphy_err(hw->wiphy, "failed to alloc tx skbuff list\n"); 1155 » » wiphy_err(hw->wiphy, "failed to alloc TX skbuff list\n");
1156 pci_free_consistent(priv->pdev, size, txq->txd, txq->txd_dma); 1156 pci_free_consistent(priv->pdev, size, txq->txd, txq->txd_dma);
1157 return -ENOMEM; 1157 return -ENOMEM;
1158 } 1158 }
1159 memset(txq->skb, 0, MWL8K_TX_DESCS * sizeof(*txq->skb)); 1159 memset(txq->skb, 0, MWL8K_TX_DESCS * sizeof(*txq->skb));
1160 1160
1161 for (i = 0; i < MWL8K_TX_DESCS; i++) { 1161 for (i = 0; i < MWL8K_TX_DESCS; i++) {
1162 struct mwl8k_tx_desc *tx_desc; 1162 struct mwl8k_tx_desc *tx_desc;
1163 int nexti; 1163 int nexti;
1164 1164
1165 tx_desc = txq->txd + i; 1165 tx_desc = txq->txd + i;
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
1566 msecs_to_jiffies(MWL8K_CMD_TIMEOUT_MS)); 1566 msecs_to_jiffies(MWL8K_CMD_TIMEOUT_MS));
1567 1567
1568 priv->hostcmd_wait = NULL; 1568 priv->hostcmd_wait = NULL;
1569 1569
1570 mwl8k_fw_unlock(hw); 1570 mwl8k_fw_unlock(hw);
1571 1571
1572 pci_unmap_single(priv->pdev, dma_addr, dma_size, 1572 pci_unmap_single(priv->pdev, dma_addr, dma_size,
1573 PCI_DMA_BIDIRECTIONAL); 1573 PCI_DMA_BIDIRECTIONAL);
1574 1574
1575 if (!timeout) { 1575 if (!timeout) {
1576 » » wiphy_err(hw->wiphy, "command %s timeout after %u ms\n", 1576 » » wiphy_err(hw->wiphy, "Command %s timeout after %u ms\n",
1577 mwl8k_cmd_name(cmd->code, buf, sizeof(buf)), 1577 mwl8k_cmd_name(cmd->code, buf, sizeof(buf)),
1578 MWL8K_CMD_TIMEOUT_MS); 1578 MWL8K_CMD_TIMEOUT_MS);
1579 rc = -ETIMEDOUT; 1579 rc = -ETIMEDOUT;
1580 } else { 1580 } else {
1581 int ms; 1581 int ms;
1582 1582
1583 ms = MWL8K_CMD_TIMEOUT_MS - jiffies_to_msecs(timeout); 1583 ms = MWL8K_CMD_TIMEOUT_MS - jiffies_to_msecs(timeout);
1584 1584
1585 rc = cmd->result ? -EINVAL : 0; 1585 rc = cmd->result ? -EINVAL : 0;
1586 if (rc) 1586 if (rc)
1587 » » » wiphy_err(hw->wiphy, "command %s error 0x%x\n", 1587 » » » wiphy_err(hw->wiphy, "Command %s error 0x%x\n",
1588 mwl8k_cmd_name(cmd->code, buf, sizeof(buf)), 1588 mwl8k_cmd_name(cmd->code, buf, sizeof(buf)),
1589 le16_to_cpu(cmd->result)); 1589 le16_to_cpu(cmd->result));
1590 else if (ms > 2000) 1590 else if (ms > 2000)
1591 » » » wiphy_notice(hw->wiphy, "command %s took %d ms\n", 1591 » » » wiphy_notice(hw->wiphy, "Command %s took %d ms\n",
1592 mwl8k_cmd_name(cmd->code, 1592 mwl8k_cmd_name(cmd->code,
1593 buf, sizeof(buf)), 1593 buf, sizeof(buf)),
1594 ms); 1594 ms);
1595 } 1595 }
1596 1596
1597 return rc; 1597 return rc;
1598 } 1598 }
1599 1599
1600 static int mwl8k_post_pervif_cmd(struct ieee80211_hw *hw, 1600 static int mwl8k_post_pervif_cmd(struct ieee80211_hw *hw,
1601 struct ieee80211_vif *vif, 1601 struct ieee80211_vif *vif,
(...skipping 1621 matching lines...) Expand 10 before | Expand all | Expand 10 after
3223 } 3223 }
3224 3224
3225 static int mwl8k_start(struct ieee80211_hw *hw) 3225 static int mwl8k_start(struct ieee80211_hw *hw)
3226 { 3226 {
3227 struct mwl8k_priv *priv = hw->priv; 3227 struct mwl8k_priv *priv = hw->priv;
3228 int rc; 3228 int rc;
3229 3229
3230 rc = request_irq(priv->pdev->irq, mwl8k_interrupt, 3230 rc = request_irq(priv->pdev->irq, mwl8k_interrupt,
3231 IRQF_SHARED, MWL8K_NAME, hw); 3231 IRQF_SHARED, MWL8K_NAME, hw);
3232 if (rc) { 3232 if (rc) {
3233 » » wiphy_err(hw->wiphy, "failed to register irq handler\n"); 3233 » » wiphy_err(hw->wiphy, "failed to register IRQ handler\n");
3234 return -EIO; 3234 return -EIO;
3235 } 3235 }
3236 3236
3237 /* Enable TX reclaim and RX tasklets. */ 3237 /* Enable TX reclaim and RX tasklets. */
3238 tasklet_enable(&priv->poll_tx_task); 3238 tasklet_enable(&priv->poll_tx_task);
3239 tasklet_enable(&priv->poll_rx_task); 3239 tasklet_enable(&priv->poll_rx_task);
3240 3240
3241 /* Enable interrupts */ 3241 /* Enable interrupts */
3242 iowrite32(MWL8K_A2H_EVENTS, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); 3242 iowrite32(MWL8K_A2H_EVENTS, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
3243 3243
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after
3951 pci_set_drvdata(pdev, hw); 3951 pci_set_drvdata(pdev, hw);
3952 3952
3953 priv = hw->priv; 3953 priv = hw->priv;
3954 priv->hw = hw; 3954 priv->hw = hw;
3955 priv->pdev = pdev; 3955 priv->pdev = pdev;
3956 priv->device_info = &mwl8k_info_tbl[id->driver_data]; 3956 priv->device_info = &mwl8k_info_tbl[id->driver_data];
3957 3957
3958 3958
3959 priv->sram = pci_iomap(pdev, 0, 0x10000); 3959 priv->sram = pci_iomap(pdev, 0, 0x10000);
3960 if (priv->sram == NULL) { 3960 if (priv->sram == NULL) {
3961 » » wiphy_err(hw->wiphy, "cannot map device sram\n"); 3961 » » wiphy_err(hw->wiphy, "Cannot map device SRAM\n");
3962 goto err_iounmap; 3962 goto err_iounmap;
3963 } 3963 }
3964 3964
3965 /* 3965 /*
3966 * If BAR0 is a 32 bit BAR, the register BAR will be BAR1. 3966 * If BAR0 is a 32 bit BAR, the register BAR will be BAR1.
3967 * If BAR0 is a 64 bit BAR, the register BAR will be BAR2. 3967 * If BAR0 is a 64 bit BAR, the register BAR will be BAR2.
3968 */ 3968 */
3969 priv->regs = pci_iomap(pdev, 1, 0x10000); 3969 priv->regs = pci_iomap(pdev, 1, 0x10000);
3970 if (priv->regs == NULL) { 3970 if (priv->regs == NULL) {
3971 priv->regs = pci_iomap(pdev, 2, 0x10000); 3971 priv->regs = pci_iomap(pdev, 2, 0x10000);
3972 if (priv->regs == NULL) { 3972 if (priv->regs == NULL) {
3973 » » » wiphy_err(hw->wiphy, "cannot map device registers\n"); 3973 » » » wiphy_err(hw->wiphy, "Cannot map device registers\n");
3974 goto err_iounmap; 3974 goto err_iounmap;
3975 } 3975 }
3976 } 3976 }
3977 3977
3978 3978
3979 /* Reset firmware and hardware */ 3979 /* Reset firmware and hardware */
3980 mwl8k_hw_reset(priv); 3980 mwl8k_hw_reset(priv);
3981 3981
3982 /* Ask userland hotplug daemon for the device firmware */ 3982 /* Ask userland hotplug daemon for the device firmware */
3983 rc = mwl8k_request_firmware(priv); 3983 rc = mwl8k_request_firmware(priv);
3984 if (rc) { 3984 if (rc) {
3985 » » wiphy_err(hw->wiphy, "firmware files not found\n"); 3985 » » wiphy_err(hw->wiphy, "Firmware files not found\n");
3986 goto err_stop_firmware; 3986 goto err_stop_firmware;
3987 } 3987 }
3988 3988
3989 /* Load firmware into hardware */ 3989 /* Load firmware into hardware */
3990 rc = mwl8k_load_firmware(hw); 3990 rc = mwl8k_load_firmware(hw);
3991 if (rc) { 3991 if (rc) {
3992 » » wiphy_err(hw->wiphy, "cannot start firmware\n"); 3992 » » wiphy_err(hw->wiphy, "Cannot start firmware\n");
3993 goto err_stop_firmware; 3993 goto err_stop_firmware;
3994 } 3994 }
3995 3995
3996 /* Reclaim memory once firmware is successfully loaded */ 3996 /* Reclaim memory once firmware is successfully loaded */
3997 mwl8k_release_firmware(priv); 3997 mwl8k_release_firmware(priv);
3998 3998
3999 3999
4000 if (priv->ap_fw) { 4000 if (priv->ap_fw) {
4001 priv->rxd_ops = priv->device_info->ap_rxd_ops; 4001 priv->rxd_ops = priv->device_info->ap_rxd_ops;
4002 if (priv->rxd_ops == NULL) { 4002 if (priv->rxd_ops == NULL) {
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
4072 4072
4073 iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS); 4073 iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS);
4074 iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); 4074 iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
4075 iowrite32(MWL8K_A2H_INT_TX_DONE | MWL8K_A2H_INT_RX_READY, 4075 iowrite32(MWL8K_A2H_INT_TX_DONE | MWL8K_A2H_INT_RX_READY,
4076 priv->regs + MWL8K_HIU_A2H_INTERRUPT_CLEAR_SEL); 4076 priv->regs + MWL8K_HIU_A2H_INTERRUPT_CLEAR_SEL);
4077 iowrite32(0xffffffff, priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS_MASK); 4077 iowrite32(0xffffffff, priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS_MASK);
4078 4078
4079 rc = request_irq(priv->pdev->irq, mwl8k_interrupt, 4079 rc = request_irq(priv->pdev->irq, mwl8k_interrupt,
4080 IRQF_SHARED, MWL8K_NAME, hw); 4080 IRQF_SHARED, MWL8K_NAME, hw);
4081 if (rc) { 4081 if (rc) {
4082 » » wiphy_err(hw->wiphy, "failed to register irq handler\n"); 4082 » » wiphy_err(hw->wiphy, "failed to register IRQ handler\n");
4083 goto err_free_queues; 4083 goto err_free_queues;
4084 } 4084 }
4085 4085
4086 /* 4086 /*
4087 * Temporarily enable interrupts. Initial firmware host 4087 * Temporarily enable interrupts. Initial firmware host
4088 * commands use interrupts and avoid polling. Disable 4088 * commands use interrupts and avoid polling. Disable
4089 * interrupts when done. 4089 * interrupts when done.
4090 */ 4090 */
4091 iowrite32(MWL8K_A2H_EVENTS, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); 4091 iowrite32(MWL8K_A2H_EVENTS, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
4092 4092
4093 /* Get config data, mac addrs etc */ 4093 /* Get config data, mac addrs etc */
4094 if (priv->ap_fw) { 4094 if (priv->ap_fw) {
4095 rc = mwl8k_cmd_get_hw_spec_ap(hw); 4095 rc = mwl8k_cmd_get_hw_spec_ap(hw);
4096 if (!rc) 4096 if (!rc)
4097 rc = mwl8k_cmd_set_hw_spec(hw); 4097 rc = mwl8k_cmd_set_hw_spec(hw);
4098 } else { 4098 } else {
4099 rc = mwl8k_cmd_get_hw_spec_sta(hw); 4099 rc = mwl8k_cmd_get_hw_spec_sta(hw);
4100 } 4100 }
4101 if (rc) { 4101 if (rc) {
4102 » » wiphy_err(hw->wiphy, "cannot initialise firmware\n"); 4102 » » wiphy_err(hw->wiphy, "Cannot initialise firmware\n");
4103 goto err_free_irq; 4103 goto err_free_irq;
4104 } 4104 }
4105 4105
4106 hw->wiphy->interface_modes = 0; 4106 hw->wiphy->interface_modes = 0;
4107 if (priv->ap_macids_supported) 4107 if (priv->ap_macids_supported)
4108 hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP); 4108 hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP);
4109 if (priv->sta_macids_supported) 4109 if (priv->sta_macids_supported)
4110 hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_STATION); 4110 hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_STATION);
4111 4111
4112 4112
4113 /* Turn radio off */ 4113 /* Turn radio off */
4114 rc = mwl8k_cmd_radio_disable(hw); 4114 rc = mwl8k_cmd_radio_disable(hw);
4115 if (rc) { 4115 if (rc) {
4116 » » wiphy_err(hw->wiphy, "cannot disable\n"); 4116 » » wiphy_err(hw->wiphy, "Cannot disable\n");
4117 goto err_free_irq; 4117 goto err_free_irq;
4118 } 4118 }
4119 4119
4120 /* Clear MAC address */ 4120 /* Clear MAC address */
4121 rc = mwl8k_cmd_set_mac_addr(hw, NULL, "\x00\x00\x00\x00\x00\x00"); 4121 rc = mwl8k_cmd_set_mac_addr(hw, NULL, "\x00\x00\x00\x00\x00\x00");
4122 if (rc) { 4122 if (rc) {
4123 » » wiphy_err(hw->wiphy, "cannot clear mac address\n"); 4123 » » wiphy_err(hw->wiphy, "Cannot clear MAC address\n");
4124 goto err_free_irq; 4124 goto err_free_irq;
4125 } 4125 }
4126 4126
4127 /* Disable interrupts */ 4127 /* Disable interrupts */
4128 iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); 4128 iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
4129 free_irq(priv->pdev->irq, hw); 4129 free_irq(priv->pdev->irq, hw);
4130 4130
4131 rc = ieee80211_register_hw(hw); 4131 rc = ieee80211_register_hw(hw);
4132 if (rc) { 4132 if (rc) {
4133 » » wiphy_err(hw->wiphy, "cannot register device\n"); 4133 » » wiphy_err(hw->wiphy, "Cannot register device\n");
4134 goto err_free_queues; 4134 goto err_free_queues;
4135 } 4135 }
4136 4136
4137 wiphy_info(hw->wiphy, "%s v%d, %pm, %s firmware %u.%u.%u.%u\n", 4137 wiphy_info(hw->wiphy, "%s v%d, %pm, %s firmware %u.%u.%u.%u\n",
4138 priv->device_info->part_name, 4138 priv->device_info->part_name,
4139 priv->hw_rev, hw->wiphy->perm_addr, 4139 priv->hw_rev, hw->wiphy->perm_addr,
4140 priv->ap_fw ? "AP" : "STA", 4140 priv->ap_fw ? "AP" : "STA",
4141 (priv->fw_rev >> 24) & 0xff, (priv->fw_rev >> 16) & 0xff, 4141 (priv->fw_rev >> 24) & 0xff, (priv->fw_rev >> 16) & 0xff,
4142 (priv->fw_rev >> 8) & 0xff, priv->fw_rev & 0xff); 4142 (priv->fw_rev >> 8) & 0xff, priv->fw_rev & 0xff);
4143 4143
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
4243 pci_unregister_driver(&mwl8k_driver); 4243 pci_unregister_driver(&mwl8k_driver);
4244 } 4244 }
4245 4245
4246 module_init(mwl8k_init); 4246 module_init(mwl8k_init);
4247 module_exit(mwl8k_exit); 4247 module_exit(mwl8k_exit);
4248 4248
4249 MODULE_DESCRIPTION(MWL8K_DESC); 4249 MODULE_DESCRIPTION(MWL8K_DESC);
4250 MODULE_VERSION(MWL8K_VERSION); 4250 MODULE_VERSION(MWL8K_VERSION);
4251 MODULE_AUTHOR("Lennert Buytenhek <buytenh@marvell.com>"); 4251 MODULE_AUTHOR("Lennert Buytenhek <buytenh@marvell.com>");
4252 MODULE_LICENSE("GPL"); 4252 MODULE_LICENSE("GPL");
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698