Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -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;
		}
		}


+4 −2
Original line number Original line Diff line number Diff line
@@ -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
+20 −24
Original line number Original line Diff line number Diff line
@@ -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)
				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)
			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;
+12 −5
Original line number Original line Diff line number Diff line
@@ -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)
		 * 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)
	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)
+2 −1
Original line number Original line Diff line number Diff line
@@ -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,
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,