Merge branch 'upstream-fixes' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6
This commit is contained in:
commit
0827f2b698
14 changed files with 147 additions and 108 deletions
|
@ -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 = {
|
||||||
&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
|
||||||
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
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
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)
|
||||||
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)
|
||||||
#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,
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
*/
|
*/
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
/* 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,
|
||||||
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 {
|
||||||
};
|
};
|
||||||
|
|
||||||
#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)
|
||||||
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,
|
||||||
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)
|
||||||
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
|
||||||
|
|
||||||
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,
|
||||||
#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)
|
||||||
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,
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
|
@ -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,
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
/* 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)
|
||||||
/* 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 {
|
||||||
#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,
|
||||||
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,
|
||||||
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,
|
||||||
|
|
||||||
/* 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,
|
||||||
|
|
||||||
/* 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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
|
|
Loading…
Add table
Reference in a new issue