Commit 0827f2b6 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream-fixes' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6

parents 70b4d63e c6f0d75a
...@@ -313,7 +313,7 @@ static struct platform_device mpsc1_device = { ...@@ -313,7 +313,7 @@ static struct platform_device mpsc1_device = {
}; };
#endif #endif
#ifdef CONFIG_MV643XX_ETH #if defined(CONFIG_MV643XX_ETH) || defined(CONFIG_MV643XX_ETH_MODULE)
static struct resource mv64x60_eth_shared_resources[] = { static struct resource mv64x60_eth_shared_resources[] = {
[0] = { [0] = {
.name = "ethernet shared base", .name = "ethernet shared base",
...@@ -456,7 +456,7 @@ static struct platform_device *mv64x60_pd_devs[] __initdata = { ...@@ -456,7 +456,7 @@ static struct platform_device *mv64x60_pd_devs[] __initdata = {
&mpsc0_device, &mpsc0_device,
&mpsc1_device, &mpsc1_device,
#endif #endif
#ifdef CONFIG_MV643XX_ETH #if defined(CONFIG_MV643XX_ETH) || defined(CONFIG_MV643XX_ETH_MODULE)
&mv64x60_eth_shared_device, &mv64x60_eth_shared_device,
#endif #endif
#ifdef CONFIG_MV643XX_ETH_0 #ifdef CONFIG_MV643XX_ETH_0
......
...@@ -2034,13 +2034,28 @@ config SKGE ...@@ -2034,13 +2034,28 @@ config SKGE
It does not support the link failover and network management It does not support the link failover and network management
features that "portable" vendor supplied sk98lin driver does. features that "portable" vendor supplied sk98lin driver does.
This driver supports adapters based on the original Yukon chipset:
Marvell 88E8001, Belkin F5D5005, CNet GigaCard, DLink DGE-530T,
Linksys EG1032/EG1064, 3Com 3C940/3C940B, SysKonnect SK-9871/9872.
It does not support the newer Yukon2 chipset: a separate driver,
sky2, is provided for Yukon2-based adapters.
To compile this driver as a module, choose M here: the module
will be called skge. This is recommended.
config SKY2 config SKY2
tristate "SysKonnect Yukon2 support (EXPERIMENTAL)" tristate "SysKonnect Yukon2 support (EXPERIMENTAL)"
depends on PCI && EXPERIMENTAL depends on PCI && EXPERIMENTAL
select CRC32 select CRC32
---help--- ---help---
This driver support the Marvell Yukon 2 Gigabit Ethernet adapter. This driver supports Gigabit Ethernet adapters based on the the
Marvell Yukon 2 chipset:
Marvell 88E8021/88E8022/88E8035/88E8036/88E8038/88E8050/88E8052/
88E8053/88E8055/88E8061/88E8062, SysKonnect SK-9E21D/SK-9S21
This driver does not support the original Yukon chipset: a seperate
driver, skge, is provided for Yukon-based adapters.
To compile this driver as a module, choose M here: the module To compile this driver as a module, choose M here: the module
will be called sky2. This is recommended. will be called sky2. This is recommended.
...@@ -2050,8 +2065,15 @@ config SK98LIN ...@@ -2050,8 +2065,15 @@ config SK98LIN
depends on PCI depends on PCI
---help--- ---help---
Say Y here if you have a Marvell Yukon or SysKonnect SK-98xx/SK-95xx Say Y here if you have a Marvell Yukon or SysKonnect SK-98xx/SK-95xx
compliant Gigabit Ethernet Adapter. The following adapters are supported compliant Gigabit Ethernet Adapter.
by this driver:
This driver supports the original Yukon chipset. A cleaner driver is
also available (skge) which seems to work better than this one.
This driver does not support the newer Yukon2 chipset. A seperate
driver, sky2, is provided to support Yukon2-based adapters.
The following adapters are supported by this driver:
- 3Com 3C940 Gigabit LOM Ethernet Adapter - 3Com 3C940 Gigabit LOM Ethernet Adapter
- 3Com 3C941 Gigabit LOM Ethernet Adapter - 3Com 3C941 Gigabit LOM Ethernet Adapter
- Allied Telesyn AT-2970LX Gigabit Ethernet Adapter - Allied Telesyn AT-2970LX Gigabit Ethernet Adapter
......
...@@ -1002,6 +1002,8 @@ static int __devinit ace_init(struct net_device *dev) ...@@ -1002,6 +1002,8 @@ static int __devinit ace_init(struct net_device *dev)
mac1 = 0; mac1 = 0;
for(i = 0; i < 4; i++) { for(i = 0; i < 4; i++) {
int tmp;
mac1 = mac1 << 8; mac1 = mac1 << 8;
tmp = read_eeprom_byte(dev, 0x8c+i); tmp = read_eeprom_byte(dev, 0x8c+i);
if (tmp < 0) { if (tmp < 0) {
...@@ -1012,6 +1014,8 @@ static int __devinit ace_init(struct net_device *dev) ...@@ -1012,6 +1014,8 @@ static int __devinit ace_init(struct net_device *dev)
} }
mac2 = 0; mac2 = 0;
for(i = 4; i < 8; i++) { for(i = 4; i < 8; i++) {
int tmp;
mac2 = mac2 << 8; mac2 = mac2 << 8;
tmp = read_eeprom_byte(dev, 0x8c+i); tmp = read_eeprom_byte(dev, 0x8c+i);
if (tmp < 0) { if (tmp < 0) {
......
...@@ -1399,7 +1399,6 @@ static int b44_open(struct net_device *dev) ...@@ -1399,7 +1399,6 @@ static int b44_open(struct net_device *dev)
b44_init_rings(bp); b44_init_rings(bp);
b44_init_hw(bp); b44_init_hw(bp);
netif_carrier_off(dev);
b44_check_phy(bp); b44_check_phy(bp);
err = request_irq(dev->irq, b44_interrupt, SA_SHIRQ, dev->name, dev); err = request_irq(dev->irq, b44_interrupt, SA_SHIRQ, dev->name, dev);
...@@ -1464,7 +1463,7 @@ static int b44_close(struct net_device *dev) ...@@ -1464,7 +1463,7 @@ static int b44_close(struct net_device *dev)
#endif #endif
b44_halt(bp); b44_halt(bp);
b44_free_rings(bp); b44_free_rings(bp);
netif_carrier_off(bp->dev); netif_carrier_off(dev);
spin_unlock_irq(&bp->lock); spin_unlock_irq(&bp->lock);
...@@ -2000,6 +1999,8 @@ static int __devinit b44_init_one(struct pci_dev *pdev, ...@@ -2000,6 +1999,8 @@ static int __devinit b44_init_one(struct pci_dev *pdev,
dev->irq = pdev->irq; dev->irq = pdev->irq;
SET_ETHTOOL_OPS(dev, &b44_ethtool_ops); SET_ETHTOOL_OPS(dev, &b44_ethtool_ops);
netif_carrier_off(dev);
err = b44_get_invariants(bp); err = b44_get_invariants(bp);
if (err) { if (err) {
printk(KERN_ERR PFX "Problem fetching invariants of chip, " printk(KERN_ERR PFX "Problem fetching invariants of chip, "
......
...@@ -576,7 +576,7 @@ static int bond_update_speed_duplex(struct slave *slave) ...@@ -576,7 +576,7 @@ static int bond_update_speed_duplex(struct slave *slave)
slave->duplex = DUPLEX_FULL; slave->duplex = DUPLEX_FULL;
if (slave_dev->ethtool_ops) { if (slave_dev->ethtool_ops) {
u32 res; int res;
if (!slave_dev->ethtool_ops->get_settings) { if (!slave_dev->ethtool_ops->get_settings) {
return -1; return -1;
......
...@@ -444,6 +444,7 @@ static int mv643xx_eth_receive_queue(struct net_device *dev) ...@@ -444,6 +444,7 @@ static int mv643xx_eth_receive_queue(struct net_device *dev)
netif_rx(skb); netif_rx(skb);
#endif #endif
} }
dev->last_rx = jiffies;
} }
return received_packets; return received_packets;
...@@ -461,7 +462,7 @@ static int mv643xx_eth_receive_queue(struct net_device *dev) ...@@ -461,7 +462,7 @@ static int mv643xx_eth_receive_queue(struct net_device *dev)
*/ */
static irqreturn_t mv643xx_eth_int_handler(int irq, void *dev_id, static irqreturn_t mv643xx_eth_int_handler(int irq, void *dev_id,
struct pt_regs *regs) struct pt_regs *regs)
{ {
struct net_device *dev = (struct net_device *)dev_id; struct net_device *dev = (struct net_device *)dev_id;
struct mv643xx_private *mp = netdev_priv(dev); struct mv643xx_private *mp = netdev_priv(dev);
...@@ -1047,16 +1048,15 @@ static int mv643xx_poll(struct net_device *dev, int *budget) ...@@ -1047,16 +1048,15 @@ static int mv643xx_poll(struct net_device *dev, int *budget)
static inline unsigned int has_tiny_unaligned_frags(struct sk_buff *skb) static inline unsigned int has_tiny_unaligned_frags(struct sk_buff *skb)
{ {
unsigned int frag; unsigned int frag;
skb_frag_t *fragp; skb_frag_t *fragp;
for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) { for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) {
fragp = &skb_shinfo(skb)->frags[frag]; fragp = &skb_shinfo(skb)->frags[frag];
if (fragp->size <= 8 && fragp->page_offset & 0x7) if (fragp->size <= 8 && fragp->page_offset & 0x7)
return 1; return 1;
}
} return 0;
return 0;
} }
...@@ -2137,26 +2137,26 @@ static void eth_port_set_multicast_list(struct net_device *dev) ...@@ -2137,26 +2137,26 @@ static void eth_port_set_multicast_list(struct net_device *dev)
*/ */
if ((dev->flags & IFF_PROMISC) || (dev->flags & IFF_ALLMULTI)) { if ((dev->flags & IFF_PROMISC) || (dev->flags & IFF_ALLMULTI)) {
for (table_index = 0; table_index <= 0xFC; table_index += 4) { for (table_index = 0; table_index <= 0xFC; table_index += 4) {
/* Set all entries in DA filter special multicast /* Set all entries in DA filter special multicast
* table (Ex_dFSMT) * table (Ex_dFSMT)
* Set for ETH_Q0 for now * Set for ETH_Q0 for now
* Bits * Bits
* 0 Accept=1, Drop=0 * 0 Accept=1, Drop=0
* 3-1 Queue ETH_Q0=0 * 3-1 Queue ETH_Q0=0
* 7-4 Reserved = 0; * 7-4 Reserved = 0;
*/ */
mv_write(MV643XX_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE(eth_port_num) + table_index, 0x01010101); mv_write(MV643XX_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE(eth_port_num) + table_index, 0x01010101);
/* Set all entries in DA filter other multicast /* Set all entries in DA filter other multicast
* table (Ex_dFOMT) * table (Ex_dFOMT)
* Set for ETH_Q0 for now * Set for ETH_Q0 for now
* Bits * Bits
* 0 Accept=1, Drop=0 * 0 Accept=1, Drop=0
* 3-1 Queue ETH_Q0=0 * 3-1 Queue ETH_Q0=0
* 7-4 Reserved = 0; * 7-4 Reserved = 0;
*/ */
mv_write(MV643XX_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE(eth_port_num) + table_index, 0x01010101); mv_write(MV643XX_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE(eth_port_num) + table_index, 0x01010101);
} }
return; return;
} }
...@@ -2617,7 +2617,6 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp, ...@@ -2617,7 +2617,6 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp,
struct eth_tx_desc *current_descriptor; struct eth_tx_desc *current_descriptor;
struct eth_tx_desc *first_descriptor; struct eth_tx_desc *first_descriptor;
u32 command; u32 command;
unsigned long flags;
/* Do not process Tx ring in case of Tx ring resource error */ /* Do not process Tx ring in case of Tx ring resource error */
if (mp->tx_resource_err) if (mp->tx_resource_err)
...@@ -2634,8 +2633,6 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp, ...@@ -2634,8 +2633,6 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp,
return ETH_ERROR; return ETH_ERROR;
} }
spin_lock_irqsave(&mp->lock, flags);
mp->tx_ring_skbs++; mp->tx_ring_skbs++;
BUG_ON(mp->tx_ring_skbs > mp->tx_ring_size); BUG_ON(mp->tx_ring_skbs > mp->tx_ring_size);
...@@ -2685,15 +2682,11 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp, ...@@ -2685,15 +2682,11 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp,
mp->tx_resource_err = 1; mp->tx_resource_err = 1;
mp->tx_curr_desc_q = tx_first_desc; mp->tx_curr_desc_q = tx_first_desc;
spin_unlock_irqrestore(&mp->lock, flags);
return ETH_QUEUE_LAST_RESOURCE; return ETH_QUEUE_LAST_RESOURCE;
} }
mp->tx_curr_desc_q = tx_next_desc; mp->tx_curr_desc_q = tx_next_desc;
spin_unlock_irqrestore(&mp->lock, flags);
return ETH_OK; return ETH_OK;
} }
#else #else
...@@ -2704,14 +2697,11 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp, ...@@ -2704,14 +2697,11 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp,
int tx_desc_used; int tx_desc_used;
struct eth_tx_desc *current_descriptor; struct eth_tx_desc *current_descriptor;
unsigned int command_status; unsigned int command_status;
unsigned long flags;
/* Do not process Tx ring in case of Tx ring resource error */ /* Do not process Tx ring in case of Tx ring resource error */
if (mp->tx_resource_err) if (mp->tx_resource_err)
return ETH_QUEUE_FULL; return ETH_QUEUE_FULL;
spin_lock_irqsave(&mp->lock, flags);
mp->tx_ring_skbs++; mp->tx_ring_skbs++;
BUG_ON(mp->tx_ring_skbs > mp->tx_ring_size); BUG_ON(mp->tx_ring_skbs > mp->tx_ring_size);
...@@ -2742,12 +2732,9 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp, ...@@ -2742,12 +2732,9 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp,
/* Check for ring index overlap in the Tx desc ring */ /* Check for ring index overlap in the Tx desc ring */
if (tx_desc_curr == tx_desc_used) { if (tx_desc_curr == tx_desc_used) {
mp->tx_resource_err = 1; mp->tx_resource_err = 1;
spin_unlock_irqrestore(&mp->lock, flags);
return ETH_QUEUE_LAST_RESOURCE; return ETH_QUEUE_LAST_RESOURCE;
} }
spin_unlock_irqrestore(&mp->lock, flags);
return ETH_OK; return ETH_OK;
} }
#endif #endif
...@@ -2898,8 +2885,10 @@ static ETH_FUNC_RET_STATUS eth_port_receive(struct mv643xx_private *mp, ...@@ -2898,8 +2885,10 @@ static ETH_FUNC_RET_STATUS eth_port_receive(struct mv643xx_private *mp,
p_pkt_info->return_info = mp->rx_skb[rx_curr_desc]; p_pkt_info->return_info = mp->rx_skb[rx_curr_desc];
p_pkt_info->l4i_chk = p_rx_desc->buf_size; p_pkt_info->l4i_chk = p_rx_desc->buf_size;
/* Clean the return info field to indicate that the packet has been */ /*
/* moved to the upper layers */ * Clean the return info field to indicate that the
* packet has been moved to the upper layers
*/
mp->rx_skb[rx_curr_desc] = NULL; mp->rx_skb[rx_curr_desc] = NULL;
/* Update current index in data structure */ /* Update current index in data structure */
...@@ -2980,7 +2969,7 @@ struct mv643xx_stats { ...@@ -2980,7 +2969,7 @@ struct mv643xx_stats {
}; };
#define MV643XX_STAT(m) sizeof(((struct mv643xx_private *)0)->m), \ #define MV643XX_STAT(m) sizeof(((struct mv643xx_private *)0)->m), \
offsetof(struct mv643xx_private, m) offsetof(struct mv643xx_private, m)
static const struct mv643xx_stats mv643xx_gstrings_stats[] = { static const struct mv643xx_stats mv643xx_gstrings_stats[] = {
{ "rx_packets", MV643XX_STAT(stats.rx_packets) }, { "rx_packets", MV643XX_STAT(stats.rx_packets) },
...@@ -3131,9 +3120,8 @@ mv643xx_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) ...@@ -3131,9 +3120,8 @@ mv643xx_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
return 0; return 0;
} }
static void static void mv643xx_get_drvinfo(struct net_device *netdev,
mv643xx_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
struct ethtool_drvinfo *drvinfo)
{ {
strncpy(drvinfo->driver, mv643xx_driver_name, 32); strncpy(drvinfo->driver, mv643xx_driver_name, 32);
strncpy(drvinfo->version, mv643xx_driver_version, 32); strncpy(drvinfo->version, mv643xx_driver_version, 32);
...@@ -3142,39 +3130,37 @@ mv643xx_get_drvinfo(struct net_device *netdev, ...@@ -3142,39 +3130,37 @@ mv643xx_get_drvinfo(struct net_device *netdev,
drvinfo->n_stats = MV643XX_STATS_LEN; drvinfo->n_stats = MV643XX_STATS_LEN;
} }
static int static int mv643xx_get_stats_count(struct net_device *netdev)
mv643xx_get_stats_count(struct net_device *netdev)
{ {
return MV643XX_STATS_LEN; return MV643XX_STATS_LEN;
} }
static void static void mv643xx_get_ethtool_stats(struct net_device *netdev,
mv643xx_get_ethtool_stats(struct net_device *netdev, struct ethtool_stats *stats, uint64_t *data)
struct ethtool_stats *stats, uint64_t *data)
{ {
struct mv643xx_private *mp = netdev->priv; struct mv643xx_private *mp = netdev->priv;
int i; int i;
eth_update_mib_counters(mp); eth_update_mib_counters(mp);
for(i = 0; i < MV643XX_STATS_LEN; i++) { for (i = 0; i < MV643XX_STATS_LEN; i++) {
char *p = (char *)mp+mv643xx_gstrings_stats[i].stat_offset; char *p = (char *)mp+mv643xx_gstrings_stats[i].stat_offset;
data[i] = (mv643xx_gstrings_stats[i].sizeof_stat == data[i] = (mv643xx_gstrings_stats[i].sizeof_stat ==
sizeof(uint64_t)) ? *(uint64_t *)p : *(uint32_t *)p; sizeof(uint64_t)) ? *(uint64_t *)p : *(uint32_t *)p;
} }
} }
static void static void mv643xx_get_strings(struct net_device *netdev, uint32_t stringset,
mv643xx_get_strings(struct net_device *netdev, uint32_t stringset, uint8_t *data) uint8_t *data)
{ {
int i; int i;
switch(stringset) { switch(stringset) {
case ETH_SS_STATS: case ETH_SS_STATS:
for (i=0; i < MV643XX_STATS_LEN; i++) { for (i=0; i < MV643XX_STATS_LEN; i++) {
memcpy(data + i * ETH_GSTRING_LEN, memcpy(data + i * ETH_GSTRING_LEN,
mv643xx_gstrings_stats[i].stat_string, mv643xx_gstrings_stats[i].stat_string,
ETH_GSTRING_LEN); ETH_GSTRING_LEN);
} }
break; break;
} }
......
...@@ -3586,7 +3586,7 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -3586,7 +3586,7 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev)
txdp->Buffer_Pointer = (u64) pci_map_page txdp->Buffer_Pointer = (u64) pci_map_page
(sp->pdev, frag->page, frag->page_offset, (sp->pdev, frag->page, frag->page_offset,
frag->size, PCI_DMA_TODEVICE); frag->size, PCI_DMA_TODEVICE);
txdp->Control_1 |= TXD_BUFFER0_SIZE(frag->size); txdp->Control_1 = TXD_BUFFER0_SIZE(frag->size);
if (skb_shinfo(skb)->ufo_size) if (skb_shinfo(skb)->ufo_size)
txdp->Control_1 |= TXD_UFO_EN; txdp->Control_1 |= TXD_UFO_EN;
} }
......
...@@ -75,7 +75,7 @@ config HOSTAP_PCI ...@@ -75,7 +75,7 @@ config HOSTAP_PCI
config HOSTAP_CS config HOSTAP_CS
tristate "Host AP driver for Prism2/2.5/3 PC Cards" tristate "Host AP driver for Prism2/2.5/3 PC Cards"
depends on PCMCIA!=n && HOSTAP depends on PCMCIA && HOSTAP
---help--- ---help---
Host AP driver's version for Prism2/2.5/3 PC Cards. Host AP driver's version for Prism2/2.5/3 PC Cards.
......
...@@ -2201,6 +2201,17 @@ static int ipw2100_alloc_skb(struct ipw2100_priv *priv, ...@@ -2201,6 +2201,17 @@ static int ipw2100_alloc_skb(struct ipw2100_priv *priv,
#define SEARCH_SNAPSHOT 1 #define SEARCH_SNAPSHOT 1
#define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff)) #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
static void ipw2100_snapshot_free(struct ipw2100_priv *priv)
{
int i;
if (!priv->snapshot[0])
return;
for (i = 0; i < 0x30; i++)
kfree(priv->snapshot[i]);
priv->snapshot[0] = NULL;
}
#ifdef CONFIG_IPW2100_DEBUG_C3
static int ipw2100_snapshot_alloc(struct ipw2100_priv *priv) static int ipw2100_snapshot_alloc(struct ipw2100_priv *priv)
{ {
int i; int i;
...@@ -2221,16 +2232,6 @@ static int ipw2100_snapshot_alloc(struct ipw2100_priv *priv) ...@@ -2221,16 +2232,6 @@ static int ipw2100_snapshot_alloc(struct ipw2100_priv *priv)
return 1; return 1;
} }
static void ipw2100_snapshot_free(struct ipw2100_priv *priv)
{
int i;
if (!priv->snapshot[0])
return;
for (i = 0; i < 0x30; i++)
kfree(priv->snapshot[i]);
priv->snapshot[0] = NULL;
}
static u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 * in_buf, static u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 * in_buf,
size_t len, int mode) size_t len, int mode)
{ {
...@@ -2269,6 +2270,7 @@ static u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 * in_buf, ...@@ -2269,6 +2270,7 @@ static u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 * in_buf,
return ret; return ret;
} }
#endif
/* /*
* *
...@@ -7112,11 +7114,17 @@ static int ipw2100_wx_set_txpow(struct net_device *dev, ...@@ -7112,11 +7114,17 @@ static int ipw2100_wx_set_txpow(struct net_device *dev,
{ {
struct ipw2100_priv *priv = ieee80211_priv(dev); struct ipw2100_priv *priv = ieee80211_priv(dev);
int err = 0, value; int err = 0, value;
if (ipw_radio_kill_sw(priv, wrqu->txpower.disabled))
return -EINPROGRESS;
if (priv->ieee->iw_mode != IW_MODE_ADHOC) if (priv->ieee->iw_mode != IW_MODE_ADHOC)
return 0;
if ((wrqu->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM)
return -EINVAL; return -EINVAL;
if (wrqu->txpower.disabled == 1 || wrqu->txpower.fixed == 0) if (wrqu->txpower.fixed == 0)
value = IPW_TX_POWER_DEFAULT; value = IPW_TX_POWER_DEFAULT;
else { else {
if (wrqu->txpower.value < IPW_TX_POWER_MIN_DBM || if (wrqu->txpower.value < IPW_TX_POWER_MIN_DBM ||
...@@ -7151,24 +7159,19 @@ static int ipw2100_wx_get_txpow(struct net_device *dev, ...@@ -7151,24 +7159,19 @@ static int ipw2100_wx_get_txpow(struct net_device *dev,
struct ipw2100_priv *priv = ieee80211_priv(dev); struct ipw2100_priv *priv = ieee80211_priv(dev);
if (priv->ieee->iw_mode != IW_MODE_ADHOC) { wrqu->txpower.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0;
wrqu->power.disabled = 1;
return 0;
}
if (priv->tx_power == IPW_TX_POWER_DEFAULT) { if (priv->tx_power == IPW_TX_POWER_DEFAULT) {
wrqu->power.fixed = 0; wrqu->txpower.fixed = 0;
wrqu->power.value = IPW_TX_POWER_MAX_DBM; wrqu->txpower.value = IPW_TX_POWER_MAX_DBM;
wrqu->power.disabled = 1;
} else { } else {
wrqu->power.disabled = 0; wrqu->txpower.fixed = 1;
wrqu->power.fixed = 1; wrqu->txpower.value = priv->tx_power;
wrqu->power.value = priv->tx_power;
} }
wrqu->power.flags = IW_TXPOW_DBM; wrqu->txpower.flags = IW_TXPOW_DBM;
IPW_DEBUG_WX("GET TX Power -> %d \n", wrqu->power.value); IPW_DEBUG_WX("GET TX Power -> %d \n", wrqu->txpower.value);
return 0; return 0;
} }
......
...@@ -8012,6 +8012,10 @@ static int ipw_sw_reset(struct ipw_priv *priv, int init) ...@@ -8012,6 +8012,10 @@ static int ipw_sw_reset(struct ipw_priv *priv, int init)
else else
IPW_DEBUG_INFO("Auto adhoc creation disabled.\n"); IPW_DEBUG_INFO("Auto adhoc creation disabled.\n");
priv->config &= ~CFG_STATIC_ESSID;
priv->essid_len = 0;
memset(priv->essid, 0, IW_ESSID_MAX_SIZE);
if (disable) { if (disable) {
priv->status |= STATUS_RF_KILL_SW; priv->status |= STATUS_RF_KILL_SW;
IPW_DEBUG_INFO("Radio disabled.\n"); IPW_DEBUG_INFO("Radio disabled.\n");
...@@ -11035,7 +11039,6 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -11035,7 +11039,6 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
net_dev->set_multicast_list = ipw_net_set_multicast_list; net_dev->set_multicast_list = ipw_net_set_multicast_list;
net_dev->set_mac_address = ipw_net_set_mac_address; net_dev->set_mac_address = ipw_net_set_mac_address;
priv->wireless_data.spy_data = &priv->ieee->spy_data; priv->wireless_data.spy_data = &priv->ieee->spy_data;
priv->wireless_data.ieee80211 = priv->ieee;
net_dev->wireless_data = &priv->wireless_data; net_dev->wireless_data = &priv->wireless_data;
net_dev->wireless_handlers = &ipw_wx_handler_def; net_dev->wireless_handlers = &ipw_wx_handler_def;
net_dev->ethtool_ops = &ipw_ethtool_ops; net_dev->ethtool_ops = &ipw_ethtool_ops;
...@@ -11121,8 +11124,8 @@ static void ipw_pci_remove(struct pci_dev *pdev) ...@@ -11121,8 +11124,8 @@ static void ipw_pci_remove(struct pci_dev *pdev)
/* Free MAC hash list for ADHOC */ /* Free MAC hash list for ADHOC */
for (i = 0; i < IPW_IBSS_MAC_HASH_SIZE; i++) { for (i = 0; i < IPW_IBSS_MAC_HASH_SIZE; i++) {
list_for_each_safe(p, q, &priv->ibss_mac_hash[i]) { list_for_each_safe(p, q, &priv->ibss_mac_hash[i]) {
kfree(list_entry(p, struct ipw_ibss_seq, list));
list_del(p); list_del(p);
kfree(list_entry(p, struct ipw_ibss_seq, list));
} }
} }
......
...@@ -261,13 +261,13 @@ orinoco_cs_config(dev_link_t *link) ...@@ -261,13 +261,13 @@ orinoco_cs_config(dev_link_t *link)
/* Note that the CIS values need to be rescaled */ /* Note that the CIS values need to be rescaled */
if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) { if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {
if (conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000) { if (conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000) {
DEBUG(2, "orinoco_cs_config: Vcc mismatch (conf.Vcc = %d, CIS = %d)\n", conf.Vcc, cfg->vcc.param[CISTPL_POWER_VNOM] / 10000); DEBUG(2, "orinoco_cs_config: Vcc mismatch (conf.Vcc = %d, cfg CIS = %d)\n", conf.Vcc, cfg->vcc.param[CISTPL_POWER_VNOM] / 10000);
if (!ignore_cis_vcc) if (!ignore_cis_vcc)
goto next_entry; goto next_entry;
} }
} else if (dflt.vcc.present & (1 << CISTPL_POWER_VNOM)) { } else if (dflt.vcc.present & (1 << CISTPL_POWER_VNOM)) {
if (conf.Vcc != dflt.vcc.param[CISTPL_POWER_VNOM] / 10000) { if (conf.Vcc != dflt.vcc.param[CISTPL_POWER_VNOM] / 10000) {
DEBUG(2, "orinoco_cs_config: Vcc mismatch (conf.Vcc = %d, CIS = %d)\n", conf.Vcc, dflt.vcc.param[CISTPL_POWER_VNOM] / 10000); DEBUG(2, "orinoco_cs_config: Vcc mismatch (conf.Vcc = %d, dflt CIS = %d)\n", conf.Vcc, dflt.vcc.param[CISTPL_POWER_VNOM] / 10000);
if(!ignore_cis_vcc) if(!ignore_cis_vcc)
goto next_entry; goto next_entry;
} }
......
...@@ -803,9 +803,9 @@ enum ieee80211_state { ...@@ -803,9 +803,9 @@ enum ieee80211_state {
#define IEEE80211_24GHZ_MAX_CHANNEL 14 #define IEEE80211_24GHZ_MAX_CHANNEL 14
#define IEEE80211_24GHZ_CHANNELS 14 #define IEEE80211_24GHZ_CHANNELS 14
#define IEEE80211_52GHZ_MIN_CHANNEL 36 #define IEEE80211_52GHZ_MIN_CHANNEL 34
#define IEEE80211_52GHZ_MAX_CHANNEL 165 #define IEEE80211_52GHZ_MAX_CHANNEL 165
#define IEEE80211_52GHZ_CHANNELS 32 #define IEEE80211_52GHZ_CHANNELS 131
enum { enum {
IEEE80211_CH_PASSIVE_ONLY = (1 << 0), IEEE80211_CH_PASSIVE_ONLY = (1 << 0),
......
...@@ -350,6 +350,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, ...@@ -350,6 +350,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
u8 src[ETH_ALEN]; u8 src[ETH_ALEN];
struct ieee80211_crypt_data *crypt = NULL; struct ieee80211_crypt_data *crypt = NULL;
int keyidx = 0; int keyidx = 0;
int can_be_decrypted = 0;
hdr = (struct ieee80211_hdr_4addr *)skb->data; hdr = (struct ieee80211_hdr_4addr *)skb->data;
stats = &ieee->stats; stats = &ieee->stats;
...@@ -410,12 +411,23 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, ...@@ -410,12 +411,23 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
return 1; return 1;
} }
if (is_multicast_ether_addr(hdr->addr1) can_be_decrypted = (is_multicast_ether_addr(hdr->addr1) ||
? ieee->host_mc_decrypt : ieee->host_decrypt) { is_broadcast_ether_addr(hdr->addr2)) ?
ieee->host_mc_decrypt : ieee->host_decrypt;
if (can_be_decrypted) {
int idx = 0; int idx = 0;
if (skb->len >= hdrlen + 3) if (skb->len >= hdrlen + 3) {
/* Top two-bits of byte 3 are the key index */
idx = skb->data[hdrlen + 3] >> 6; idx = skb->data[hdrlen + 3] >> 6;
}
/* ieee->crypt[] is WEP_KEY (4) in length. Given that idx
* is only allowed 2-bits of storage, no value of idx can
* be provided via above code that would result in idx
* being out of range */
crypt = ieee->crypt[idx]; crypt = ieee->crypt[idx];
#ifdef NOT_YET #ifdef NOT_YET
sta = NULL; sta = NULL;
...@@ -553,7 +565,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, ...@@ -553,7 +565,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
/* skb: hdr + (possibly fragmented, possibly encrypted) payload */ /* skb: hdr + (possibly fragmented, possibly encrypted) payload */
if (ieee->host_decrypt && (fc & IEEE80211_FCTL_PROTECTED) && if ((fc & IEEE80211_FCTL_PROTECTED) && can_be_decrypted &&
(keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0)
goto rx_dropped; goto rx_dropped;
...@@ -617,7 +629,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, ...@@ -617,7 +629,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
/* skb: hdr + (possible reassembled) full MSDU payload; possibly still /* skb: hdr + (possible reassembled) full MSDU payload; possibly still
* encrypted/authenticated */ * encrypted/authenticated */
if (ieee->host_decrypt && (fc & IEEE80211_FCTL_PROTECTED) && if ((fc & IEEE80211_FCTL_PROTECTED) && can_be_decrypted &&
ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt))
goto rx_dropped; goto rx_dropped;
...@@ -1439,7 +1451,7 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee, ...@@ -1439,7 +1451,7 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee,
break; break;
case IEEE80211_STYPE_PROBE_REQ: case IEEE80211_STYPE_PROBE_REQ:
IEEE80211_DEBUG_MGMT("recieved auth (%d)\n", IEEE80211_DEBUG_MGMT("received auth (%d)\n",
WLAN_FC_GET_STYPE(le16_to_cpu WLAN_FC_GET_STYPE(le16_to_cpu
(header->frame_ctl))); (header->frame_ctl)));
...@@ -1473,7 +1485,7 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee, ...@@ -1473,7 +1485,7 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee,
break; break;
case IEEE80211_STYPE_AUTH: case IEEE80211_STYPE_AUTH:
IEEE80211_DEBUG_MGMT("recieved auth (%d)\n", IEEE80211_DEBUG_MGMT("received auth (%d)\n",
WLAN_FC_GET_STYPE(le16_to_cpu WLAN_FC_GET_STYPE(le16_to_cpu
(header->frame_ctl))); (header->frame_ctl)));
......
...@@ -232,15 +232,18 @@ static char *ipw2100_translate_scan(struct ieee80211_device *ieee, ...@@ -232,15 +232,18 @@ static char *ipw2100_translate_scan(struct ieee80211_device *ieee,
return start; return start;
} }
#define SCAN_ITEM_SIZE 128
int ieee80211_wx_get_scan(struct ieee80211_device *ieee, int ieee80211_wx_get_scan(struct ieee80211_device *ieee,
struct iw_request_info *info, struct iw_request_info *info,
union iwreq_data *wrqu, char *extra) union iwreq_data *wrqu, char *extra)
{ {
struct ieee80211_network *network; struct ieee80211_network *network;
unsigned long flags; unsigned long flags;
int err = 0;
char *ev = extra; char *ev = extra;
char *stop = ev + IW_SCAN_MAX_DATA; char *stop = ev + wrqu->data.length;
int i = 0; int i = 0;
IEEE80211_DEBUG_WX("Getting scan\n"); IEEE80211_DEBUG_WX("Getting scan\n");
...@@ -249,6 +252,11 @@ int ieee80211_wx_get_scan(struct ieee80211_device *ieee, ...@@ -249,6 +252,11 @@ int ieee80211_wx_get_scan(struct ieee80211_device *ieee,
list_for_each_entry(network, &ieee->network_list, list) { list_for_each_entry(network, &ieee->network_list, list) {
i++; i++;
if (stop - ev < SCAN_ITEM_SIZE) {
err = -E2BIG;
break;
}
if (ieee->scan_age == 0 || if (ieee->scan_age == 0 ||
time_after(network->last_scanned + ieee->scan_age, jiffies)) time_after(network->last_scanned + ieee->scan_age, jiffies))
ev = ipw2100_translate_scan(ieee, ev, stop, network); ev = ipw2100_translate_scan(ieee, ev, stop, network);
...@@ -270,7 +278,7 @@ int ieee80211_wx_get_scan(struct ieee80211_device *ieee, ...@@ -270,7 +278,7 @@ int ieee80211_wx_get_scan(struct ieee80211_device *ieee,
IEEE80211_DEBUG_WX("exit: %d networks returned.\n", i); IEEE80211_DEBUG_WX("exit: %d networks returned.\n", i);
return 0; return err;
} }
int ieee80211_wx_set_encode(struct ieee80211_device *ieee, int ieee80211_wx_set_encode(struct ieee80211_device *ieee,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment