summaryrefslogtreecommitdiffstats
path: root/src/drivers/net/rtl818x/rtl818x.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/net/rtl818x/rtl818x.c')
-rw-r--r--src/drivers/net/rtl818x/rtl818x.c56
1 files changed, 32 insertions, 24 deletions
diff --git a/src/drivers/net/rtl818x/rtl818x.c b/src/drivers/net/rtl818x/rtl818x.c
index 8ffe1135..672ff9c2 100644
--- a/src/drivers/net/rtl818x/rtl818x.c
+++ b/src/drivers/net/rtl818x/rtl818x.c
@@ -186,13 +186,16 @@ static int rtl818x_tx(struct net80211_device *dev, struct io_buffer *iob)
plcp_len |= 1 << 15;
}
+ entry = &priv->tx_ring[priv->tx_prod];
+
if (dev->phy_flags & NET80211_PHY_USE_PROTECTION) {
tx_flags |= RTL818X_TX_DESC_FLAG_CTS;
tx_flags |= priv->hw_rtscts_rate << 19;
+ entry->rts_duration = net80211_cts_duration(dev, len);
+ } else {
+ entry->rts_duration = 0;
}
- entry = &priv->tx_ring[priv->tx_prod];
-
if (entry->flags & RTL818X_TX_DESC_FLAG_OWN) {
/* card hasn't processed the old packet yet! */
return -EBUSY;
@@ -201,7 +204,6 @@ static int rtl818x_tx(struct net80211_device *dev, struct io_buffer *iob)
priv->tx_buf[priv->tx_prod] = iob;
priv->tx_prod = (priv->tx_prod + 1) % RTL818X_TX_RING_SIZE;
- entry->rts_duration = 0;
entry->plcp_len = cpu_to_le16(plcp_len);
entry->tx_buf = cpu_to_le32(virt_to_bus(iob->data));
entry->frame_len = cpu_to_le32(len);
@@ -626,20 +628,7 @@ static struct bit_basher_operations rtl818x_basher_ops = {
.write = rtl818x_spi_write_bit,
};
-/* The net80211 code makes a copy of this, so we're OK modifying the
- static version as we initialize the card, as long as we don't
- depend on possibly-modified values in case there are multiple cards. */
-static struct net80211_hw_info rtl818x_hwinfo = {
- /* MAC address filled in at runtime */
- /* modes filled in at runtime */
- .bands = NET80211_BAND_2GHZ,
- .flags = NET80211_HW_RX_HAS_FCS,
- .signal_type = NET80211_SIGNAL_ARBITRARY,
- /* supported rates filled in at runtime */
- .signal_max = 65,
- .channel_change_time = 1000, /* no idea what the actual value is */
-};
-
+#if DBGLVL_MAX
static const char *rtl818x_rf_names[] = {
NULL, /* no 0 */
"Intersil", "RFMD", /* unsupported 1-2 */
@@ -649,6 +638,7 @@ static const char *rtl818x_rf_names[] = {
"RTL8255", /* unsupported 10 */
};
#define RTL818X_NR_RF_NAMES 11
+#endif
struct net80211_device_operations rtl818x_operations = {
.open = rtl818x_start,
@@ -669,6 +659,13 @@ static int rtl818x_probe(struct pci_device *pdev,
const char *chip_name;
u32 reg;
u16 eeprom_val;
+ struct net80211_hw_info *hwinfo;
+
+ hwinfo = zalloc(sizeof(*hwinfo));
+ if (!hwinfo) {
+ DBG("rtl818x: hwinfo alloc failed\n");
+ return -ENOMEM;
+ }
adjust_pci_device(pdev);
@@ -715,15 +712,21 @@ static int rtl818x_probe(struct pci_device *pdev,
priv->r8185 = reg & RTL818X_TX_CONF_R8185_ABC;
- memcpy(rtl818x_hwinfo.supported_rates, rtl818x_rates,
+ hwinfo->bands = NET80211_BAND_BIT_2GHZ;
+ hwinfo->flags = NET80211_HW_RX_HAS_FCS;
+ hwinfo->signal_type = NET80211_SIGNAL_ARBITRARY;
+ hwinfo->signal_max = 65;
+ hwinfo->channel_change_time = 1000;
+
+ memcpy(hwinfo->rates[NET80211_BAND_2GHZ], rtl818x_rates,
sizeof(*rtl818x_rates) * RTL818X_NR_RATES);
if (priv->r8185) {
- rtl818x_hwinfo.modes = NET80211_MODE_B | NET80211_MODE_G;
- rtl818x_hwinfo.nr_supported_rates = RTL818X_NR_RATES;
+ hwinfo->modes = NET80211_MODE_B | NET80211_MODE_G;
+ hwinfo->nr_rates[NET80211_BAND_2GHZ] = RTL818X_NR_RATES;
} else {
- rtl818x_hwinfo.modes = NET80211_MODE_B;
- rtl818x_hwinfo.nr_supported_rates = RTL818X_NR_B_RATES;
+ hwinfo->modes = NET80211_MODE_B;
+ hwinfo->nr_rates[NET80211_BAND_2GHZ] = RTL818X_NR_B_RATES;
}
priv->spibit.basher.op = &rtl818x_basher_ops;
@@ -755,6 +758,7 @@ static int rtl818x_probe(struct pci_device *pdev,
}
if (!priv->rf) {
+#if DBGLVL_MAX
if (eeprom_val < RTL818X_NR_RF_NAMES &&
rtl818x_rf_names[eeprom_val] != NULL)
DBG("rtl818x: %s RF frontend not supported!\n",
@@ -762,6 +766,7 @@ static int rtl818x_probe(struct pci_device *pdev,
else
DBG("rtl818x: RF frontend #%d not recognized!\n",
eeprom_val);
+#endif
err = -ENOSYS;
goto err_free_dev;
@@ -777,7 +782,7 @@ static int rtl818x_probe(struct pci_device *pdev,
}
/* read the MAC address */
- nvs_read(&priv->eeprom.nvs, 0x7, rtl818x_hwinfo.hwaddr, 6);
+ nvs_read(&priv->eeprom.nvs, 0x7, hwinfo->hwaddr, 6);
/* CCK TX power */
for (i = 0; i < 14; i += 2) {
@@ -799,12 +804,14 @@ static int rtl818x_probe(struct pci_device *pdev,
rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL);
- err = net80211_register(dev, &rtl818x_operations, &rtl818x_hwinfo);
+ err = net80211_register(dev, &rtl818x_operations, hwinfo);
if (err) {
DBG("rtl818x: cannot register device\n");
goto err_free_dev;
}
+ free(hwinfo);
+
DBG("rtl818x: Realtek RTL818%s (RF chip %s) with address %s\n",
chip_name, priv->rf->name, netdev_hwaddr(dev->netdev));
@@ -813,6 +820,7 @@ static int rtl818x_probe(struct pci_device *pdev,
err_free_dev:
pci_set_drvdata(pdev, NULL);
net80211_free(dev);
+ free(hwinfo);
return err;
}