Merge branch 'upstream-fixes' into upstream
This commit is contained in:
@@ -1003,7 +1003,8 @@ static int corkscrew_start_xmit(struct sk_buff *skb,
|
|||||||
/* Calculate the next Tx descriptor entry. */
|
/* Calculate the next Tx descriptor entry. */
|
||||||
int entry = vp->cur_tx % TX_RING_SIZE;
|
int entry = vp->cur_tx % TX_RING_SIZE;
|
||||||
struct boom_tx_desc *prev_entry;
|
struct boom_tx_desc *prev_entry;
|
||||||
unsigned long flags, i;
|
unsigned long flags;
|
||||||
|
int i;
|
||||||
|
|
||||||
if (vp->tx_full) /* No room to transmit with */
|
if (vp->tx_full) /* No room to transmit with */
|
||||||
return 1;
|
return 1;
|
||||||
|
@@ -345,6 +345,7 @@ typedef struct local_info_t {
|
|||||||
void __iomem *dingo_ccr; /* only used for CEM56 cards */
|
void __iomem *dingo_ccr; /* only used for CEM56 cards */
|
||||||
unsigned last_ptr_value; /* last packets transmitted value */
|
unsigned last_ptr_value; /* last packets transmitted value */
|
||||||
const char *manf_str;
|
const char *manf_str;
|
||||||
|
struct work_struct tx_timeout_task;
|
||||||
} local_info_t;
|
} local_info_t;
|
||||||
|
|
||||||
/****************
|
/****************
|
||||||
@@ -352,6 +353,7 @@ typedef struct local_info_t {
|
|||||||
*/
|
*/
|
||||||
static int do_start_xmit(struct sk_buff *skb, struct net_device *dev);
|
static int do_start_xmit(struct sk_buff *skb, struct net_device *dev);
|
||||||
static void do_tx_timeout(struct net_device *dev);
|
static void do_tx_timeout(struct net_device *dev);
|
||||||
|
static void xirc2ps_tx_timeout_task(void *data);
|
||||||
static struct net_device_stats *do_get_stats(struct net_device *dev);
|
static struct net_device_stats *do_get_stats(struct net_device *dev);
|
||||||
static void set_addresses(struct net_device *dev);
|
static void set_addresses(struct net_device *dev);
|
||||||
static void set_multicast_list(struct net_device *dev);
|
static void set_multicast_list(struct net_device *dev);
|
||||||
@@ -589,6 +591,7 @@ xirc2ps_probe(struct pcmcia_device *link)
|
|||||||
#ifdef HAVE_TX_TIMEOUT
|
#ifdef HAVE_TX_TIMEOUT
|
||||||
dev->tx_timeout = do_tx_timeout;
|
dev->tx_timeout = do_tx_timeout;
|
||||||
dev->watchdog_timeo = TX_TIMEOUT;
|
dev->watchdog_timeo = TX_TIMEOUT;
|
||||||
|
INIT_WORK(&local->tx_timeout_task, xirc2ps_tx_timeout_task, dev);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return xirc2ps_config(link);
|
return xirc2ps_config(link);
|
||||||
@@ -1341,17 +1344,24 @@ xirc2ps_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
|||||||
/*====================================================================*/
|
/*====================================================================*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_tx_timeout(struct net_device *dev)
|
xirc2ps_tx_timeout_task(void *data)
|
||||||
{
|
{
|
||||||
local_info_t *lp = netdev_priv(dev);
|
struct net_device *dev = data;
|
||||||
printk(KERN_NOTICE "%s: transmit timed out\n", dev->name);
|
|
||||||
lp->stats.tx_errors++;
|
|
||||||
/* reset the card */
|
/* reset the card */
|
||||||
do_reset(dev,1);
|
do_reset(dev,1);
|
||||||
dev->trans_start = jiffies;
|
dev->trans_start = jiffies;
|
||||||
netif_wake_queue(dev);
|
netif_wake_queue(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_tx_timeout(struct net_device *dev)
|
||||||
|
{
|
||||||
|
local_info_t *lp = netdev_priv(dev);
|
||||||
|
lp->stats.tx_errors++;
|
||||||
|
printk(KERN_NOTICE "%s: transmit timed out\n", dev->name);
|
||||||
|
schedule_work(&lp->tx_timeout_task);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
do_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
do_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
{
|
{
|
||||||
|
@@ -202,6 +202,8 @@ static int homepna[MAX_UNITS];
|
|||||||
#define CSR15 15
|
#define CSR15 15
|
||||||
#define PCNET32_MC_FILTER 8
|
#define PCNET32_MC_FILTER 8
|
||||||
|
|
||||||
|
#define PCNET32_79C970A 0x2621
|
||||||
|
|
||||||
/* The PCNET32 Rx and Tx ring descriptors. */
|
/* The PCNET32 Rx and Tx ring descriptors. */
|
||||||
struct pcnet32_rx_head {
|
struct pcnet32_rx_head {
|
||||||
u32 base;
|
u32 base;
|
||||||
@@ -289,6 +291,7 @@ struct pcnet32_private {
|
|||||||
|
|
||||||
/* each bit indicates an available PHY */
|
/* each bit indicates an available PHY */
|
||||||
u32 phymask;
|
u32 phymask;
|
||||||
|
unsigned short chip_version; /* which variant this is */
|
||||||
};
|
};
|
||||||
|
|
||||||
static int pcnet32_probe_pci(struct pci_dev *, const struct pci_device_id *);
|
static int pcnet32_probe_pci(struct pci_dev *, const struct pci_device_id *);
|
||||||
@@ -724,9 +727,11 @@ static u32 pcnet32_get_link(struct net_device *dev)
|
|||||||
spin_lock_irqsave(&lp->lock, flags);
|
spin_lock_irqsave(&lp->lock, flags);
|
||||||
if (lp->mii) {
|
if (lp->mii) {
|
||||||
r = mii_link_ok(&lp->mii_if);
|
r = mii_link_ok(&lp->mii_if);
|
||||||
} else {
|
} else if (lp->chip_version >= PCNET32_79C970A) {
|
||||||
ulong ioaddr = dev->base_addr; /* card base I/O address */
|
ulong ioaddr = dev->base_addr; /* card base I/O address */
|
||||||
r = (lp->a.read_bcr(ioaddr, 4) != 0xc0);
|
r = (lp->a.read_bcr(ioaddr, 4) != 0xc0);
|
||||||
|
} else { /* can not detect link on really old chips */
|
||||||
|
r = 1;
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&lp->lock, flags);
|
spin_unlock_irqrestore(&lp->lock, flags);
|
||||||
|
|
||||||
@@ -1091,6 +1096,10 @@ static int pcnet32_suspend(struct net_device *dev, unsigned long *flags,
|
|||||||
ulong ioaddr = dev->base_addr;
|
ulong ioaddr = dev->base_addr;
|
||||||
int ticks;
|
int ticks;
|
||||||
|
|
||||||
|
/* really old chips have to be stopped. */
|
||||||
|
if (lp->chip_version < PCNET32_79C970A)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* set SUSPEND (SPND) - CSR5 bit 0 */
|
/* set SUSPEND (SPND) - CSR5 bit 0 */
|
||||||
csr5 = a->read_csr(ioaddr, CSR5);
|
csr5 = a->read_csr(ioaddr, CSR5);
|
||||||
a->write_csr(ioaddr, CSR5, csr5 | CSR5_SUSPEND);
|
a->write_csr(ioaddr, CSR5, csr5 | CSR5_SUSPEND);
|
||||||
@@ -1529,6 +1538,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
|
|||||||
lp->mii_if.reg_num_mask = 0x1f;
|
lp->mii_if.reg_num_mask = 0x1f;
|
||||||
lp->dxsuflo = dxsuflo;
|
lp->dxsuflo = dxsuflo;
|
||||||
lp->mii = mii;
|
lp->mii = mii;
|
||||||
|
lp->chip_version = chip_version;
|
||||||
lp->msg_enable = pcnet32_debug;
|
lp->msg_enable = pcnet32_debug;
|
||||||
if ((cards_found >= MAX_UNITS)
|
if ((cards_found >= MAX_UNITS)
|
||||||
|| (options[cards_found] > sizeof(options_mapping)))
|
|| (options[cards_found] > sizeof(options_mapping)))
|
||||||
@@ -1839,10 +1849,7 @@ static int pcnet32_open(struct net_device *dev)
|
|||||||
val |= 2;
|
val |= 2;
|
||||||
} else if (lp->options & PCNET32_PORT_ASEL) {
|
} else if (lp->options & PCNET32_PORT_ASEL) {
|
||||||
/* workaround of xSeries250, turn on for 79C975 only */
|
/* workaround of xSeries250, turn on for 79C975 only */
|
||||||
i = ((lp->a.read_csr(ioaddr, 88) |
|
if (lp->chip_version == 0x2627)
|
||||||
(lp->a.
|
|
||||||
read_csr(ioaddr, 89) << 16)) >> 12) & 0xffff;
|
|
||||||
if (i == 0x2627)
|
|
||||||
val |= 3;
|
val |= 3;
|
||||||
}
|
}
|
||||||
lp->a.write_bcr(ioaddr, 9, val);
|
lp->a.write_bcr(ioaddr, 9, val);
|
||||||
@@ -1986,9 +1993,11 @@ static int pcnet32_open(struct net_device *dev)
|
|||||||
|
|
||||||
netif_start_queue(dev);
|
netif_start_queue(dev);
|
||||||
|
|
||||||
/* Print the link status and start the watchdog */
|
if (lp->chip_version >= PCNET32_79C970A) {
|
||||||
pcnet32_check_media(dev, 1);
|
/* Print the link status and start the watchdog */
|
||||||
mod_timer(&(lp->watchdog_timer), PCNET32_WATCHDOG_TIMEOUT);
|
pcnet32_check_media(dev, 1);
|
||||||
|
mod_timer(&(lp->watchdog_timer), PCNET32_WATCHDOG_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
while (i++ < 100)
|
while (i++ < 100)
|
||||||
|
@@ -1042,6 +1042,9 @@ static int prism2_reset_port(struct net_device *dev)
|
|||||||
dev->name, local->fragm_threshold);
|
dev->name, local->fragm_threshold);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Some firmwares lose antenna selection settings on reset */
|
||||||
|
(void) hostap_set_antsel(local);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -242,7 +242,7 @@ spectrum_reset(struct pcmcia_device *link, int idle)
|
|||||||
u_int save_cor;
|
u_int save_cor;
|
||||||
|
|
||||||
/* Doing it if hardware is gone is guaranteed crash */
|
/* Doing it if hardware is gone is guaranteed crash */
|
||||||
if (pcmcia_dev_present(link))
|
if (!pcmcia_dev_present(link))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
/* Save original COR value */
|
/* Save original COR value */
|
||||||
|
Reference in New Issue
Block a user