Commit 89d8ab69 authored by Linus Torvalds's avatar Linus Torvalds

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

* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6:
  drivers/net/hamradio/baycom_ser_fdx build fix
  usb-net/pegasus: fix pegasus carrier detection
  sis900: Allocate rx replacement buffer before rx operation
  [netdrvr] depca: handle platform_device_add() failure
parents d80a7920 5efb764c
...@@ -1491,8 +1491,9 @@ static void __init depca_platform_probe (void) ...@@ -1491,8 +1491,9 @@ static void __init depca_platform_probe (void)
depca_io_ports[i].device = pldev; depca_io_ports[i].device = pldev;
if (platform_device_add(pldev)) { if (platform_device_add(pldev)) {
platform_device_put(pldev);
depca_io_ports[i].device = NULL; depca_io_ports[i].device = NULL;
pldev->dev.platform_data = NULL;
platform_device_put(pldev);
continue; continue;
} }
......
...@@ -75,12 +75,14 @@ ...@@ -75,12 +75,14 @@
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/hdlcdrv.h> #include <linux/hdlcdrv.h>
#include <linux/baycom.h> #include <linux/baycom.h>
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/irq.h>
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
#define BAYCOM_DEBUG #define BAYCOM_DEBUG
......
...@@ -1755,6 +1755,24 @@ static int sis900_rx(struct net_device *net_dev) ...@@ -1755,6 +1755,24 @@ static int sis900_rx(struct net_device *net_dev)
} else { } else {
struct sk_buff * skb; struct sk_buff * skb;
pci_unmap_single(sis_priv->pci_dev,
sis_priv->rx_ring[entry].bufptr, RX_BUF_SIZE,
PCI_DMA_FROMDEVICE);
/* refill the Rx buffer, what if there is not enought
* memory for new socket buffer ?? */
if ((skb = dev_alloc_skb(RX_BUF_SIZE)) == NULL) {
/*
* Not enough memory to refill the buffer
* so we need to recycle the old one so
* as to avoid creating a memory hole
* in the rx ring
*/
skb = sis_priv->rx_skbuff[entry];
sis_priv->stats.rx_dropped++;
goto refill_rx_ring;
}
/* This situation should never happen, but due to /* This situation should never happen, but due to
some unknow bugs, it is possible that some unknow bugs, it is possible that
we are working on NULL sk_buff :-( */ we are working on NULL sk_buff :-( */
...@@ -1768,9 +1786,6 @@ static int sis900_rx(struct net_device *net_dev) ...@@ -1768,9 +1786,6 @@ static int sis900_rx(struct net_device *net_dev)
break; break;
} }
pci_unmap_single(sis_priv->pci_dev,
sis_priv->rx_ring[entry].bufptr, RX_BUF_SIZE,
PCI_DMA_FROMDEVICE);
/* give the socket buffer to upper layers */ /* give the socket buffer to upper layers */
skb = sis_priv->rx_skbuff[entry]; skb = sis_priv->rx_skbuff[entry];
skb_put(skb, rx_size); skb_put(skb, rx_size);
...@@ -1783,33 +1798,14 @@ static int sis900_rx(struct net_device *net_dev) ...@@ -1783,33 +1798,14 @@ static int sis900_rx(struct net_device *net_dev)
net_dev->last_rx = jiffies; net_dev->last_rx = jiffies;
sis_priv->stats.rx_bytes += rx_size; sis_priv->stats.rx_bytes += rx_size;
sis_priv->stats.rx_packets++; sis_priv->stats.rx_packets++;
sis_priv->dirty_rx++;
/* refill the Rx buffer, what if there is not enought refill_rx_ring:
* memory for new socket buffer ?? */
if ((skb = dev_alloc_skb(RX_BUF_SIZE)) == NULL) {
/* not enough memory for skbuff, this makes a
* "hole" on the buffer ring, it is not clear
* how the hardware will react to this kind
* of degenerated buffer */
if (netif_msg_rx_status(sis_priv))
printk(KERN_INFO "%s: Memory squeeze,"
"deferring packet.\n",
net_dev->name);
sis_priv->rx_skbuff[entry] = NULL;
/* reset buffer descriptor state */
sis_priv->rx_ring[entry].cmdsts = 0;
sis_priv->rx_ring[entry].bufptr = 0;
sis_priv->stats.rx_dropped++;
sis_priv->cur_rx++;
break;
}
skb->dev = net_dev; skb->dev = net_dev;
sis_priv->rx_skbuff[entry] = skb; sis_priv->rx_skbuff[entry] = skb;
sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE; sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE;
sis_priv->rx_ring[entry].bufptr = sis_priv->rx_ring[entry].bufptr =
pci_map_single(sis_priv->pci_dev, skb->data, pci_map_single(sis_priv->pci_dev, skb->data,
RX_BUF_SIZE, PCI_DMA_FROMDEVICE); RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
sis_priv->dirty_rx++;
} }
sis_priv->cur_rx++; sis_priv->cur_rx++;
entry = sis_priv->cur_rx % NUM_RX_DESC; entry = sis_priv->cur_rx % NUM_RX_DESC;
......
...@@ -316,6 +316,7 @@ static int update_eth_regs_async(pegasus_t * pegasus) ...@@ -316,6 +316,7 @@ static int update_eth_regs_async(pegasus_t * pegasus)
return ret; return ret;
} }
/* Returns 0 on success, error on failure */
static int read_mii_word(pegasus_t * pegasus, __u8 phy, __u8 indx, __u16 * regd) static int read_mii_word(pegasus_t * pegasus, __u8 phy, __u8 indx, __u16 * regd)
{ {
int i; int i;
...@@ -847,10 +848,16 @@ static void intr_callback(struct urb *urb) ...@@ -847,10 +848,16 @@ static void intr_callback(struct urb *urb)
* d[0].NO_CARRIER kicks in only with failed TX. * d[0].NO_CARRIER kicks in only with failed TX.
* ... so monitoring with MII may be safest. * ... so monitoring with MII may be safest.
*/ */
if (pegasus->features & TRUST_LINK_STATUS) {
if (d[5] & LINK_STATUS)
netif_carrier_on(net);
else
netif_carrier_off(net);
} else {
/* Never set carrier _on_ based on ! NO_CARRIER */
if (d[0] & NO_CARRIER) if (d[0] & NO_CARRIER)
netif_carrier_off(net); netif_carrier_off(net);
else }
netif_carrier_on(net);
/* bytes 3-4 == rx_lostpkt, reg 2E/2F */ /* bytes 3-4 == rx_lostpkt, reg 2E/2F */
pegasus->stats.rx_missed_errors += ((d[3] & 0x7f) << 8) | d[4]; pegasus->stats.rx_missed_errors += ((d[3] & 0x7f) << 8) | d[4];
...@@ -950,7 +957,7 @@ static void set_carrier(struct net_device *net) ...@@ -950,7 +957,7 @@ static void set_carrier(struct net_device *net)
pegasus_t *pegasus = netdev_priv(net); pegasus_t *pegasus = netdev_priv(net);
u16 tmp; u16 tmp;
if (!read_mii_word(pegasus, pegasus->phy, MII_BMSR, &tmp)) if (read_mii_word(pegasus, pegasus->phy, MII_BMSR, &tmp))
return; return;
if (tmp & BMSR_LSTATUS) if (tmp & BMSR_LSTATUS)
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#define PEGASUS_II 0x80000000 #define PEGASUS_II 0x80000000
#define HAS_HOME_PNA 0x40000000 #define HAS_HOME_PNA 0x40000000
#define TRUST_LINK_STATUS 0x20000000
#define PEGASUS_MTU 1536 #define PEGASUS_MTU 1536
#define RX_SKBS 4 #define RX_SKBS 4
...@@ -203,7 +204,7 @@ PEGASUS_DEV( "AEI USB Fast Ethernet Adapter", VENDOR_AEILAB, 0x1701, ...@@ -203,7 +204,7 @@ PEGASUS_DEV( "AEI USB Fast Ethernet Adapter", VENDOR_AEILAB, 0x1701,
PEGASUS_DEV( "Allied Telesyn Int. AT-USB100", VENDOR_ALLIEDTEL, 0xb100, PEGASUS_DEV( "Allied Telesyn Int. AT-USB100", VENDOR_ALLIEDTEL, 0xb100,
DEFAULT_GPIO_RESET | PEGASUS_II ) DEFAULT_GPIO_RESET | PEGASUS_II )
PEGASUS_DEV( "Belkin F5D5050 USB Ethernet", VENDOR_BELKIN, 0x0121, PEGASUS_DEV( "Belkin F5D5050 USB Ethernet", VENDOR_BELKIN, 0x0121,
DEFAULT_GPIO_RESET | PEGASUS_II ) DEFAULT_GPIO_RESET | PEGASUS_II | TRUST_LINK_STATUS )
PEGASUS_DEV( "Billionton USB-100", VENDOR_BILLIONTON, 0x0986, PEGASUS_DEV( "Billionton USB-100", VENDOR_BILLIONTON, 0x0986,
DEFAULT_GPIO_RESET ) DEFAULT_GPIO_RESET )
PEGASUS_DEV( "Billionton USBLP-100", VENDOR_BILLIONTON, 0x0987, PEGASUS_DEV( "Billionton USBLP-100", VENDOR_BILLIONTON, 0x0987,
......
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