 323b34963d
			
		
	
	
	323b34963d
	
	
	
		
			
			Pegasus driver used single callback for sync and async control URBs. Special flags were employed to distinguish between both, but due to flawed logic it didn't always work. As a result of this change [get|set]_registers() are now much simpler. Async write is also leaner and does not use single, statically allocated memory for usb_ctrlrequest, which is another potential race when asynchronously submitting URBs. Signed-off-by: Petko Manolov <petkan@nucleusys.com> Signed-off-by: David S. Miller <davem@davemloft.net>
		
			
				
	
	
		
			308 lines
		
	
	
	
		
			10 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			308 lines
		
	
	
	
		
			10 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 1999-2013 Petko Manolov (petkan@nucleusys.com)
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License version 2 as published
 | |
|  * by the Free Software Foundation.
 | |
|  */
 | |
| 
 | |
| 
 | |
| #ifndef	PEGASUS_DEV
 | |
| 
 | |
| #define	PEGASUS_II		0x80000000
 | |
| #define	HAS_HOME_PNA		0x40000000
 | |
| 
 | |
| #define	PEGASUS_MTU		1536
 | |
| 
 | |
| #define	EPROM_WRITE		0x01
 | |
| #define	EPROM_READ		0x02
 | |
| #define	EPROM_DONE		0x04
 | |
| #define	EPROM_WR_ENABLE		0x10
 | |
| #define	EPROM_LOAD		0x20
 | |
| 
 | |
| #define	PHY_DONE		0x80
 | |
| #define	PHY_READ		0x40
 | |
| #define	PHY_WRITE		0x20
 | |
| #define	DEFAULT_GPIO_RESET	0x24
 | |
| #define	DEFAULT_GPIO_SET	0x26
 | |
| 
 | |
| #define	PEGASUS_PRESENT		0x00000001
 | |
| #define	PEGASUS_TX_BUSY		0x00000004
 | |
| #define	PEGASUS_RX_BUSY		0x00000008
 | |
| #define	CTRL_URB_RUNNING	0x00000010
 | |
| #define	CTRL_URB_SLEEP		0x00000020
 | |
| #define	PEGASUS_UNPLUG		0x00000040
 | |
| #define	PEGASUS_RX_URB_FAIL	0x00000080
 | |
| 
 | |
| #define	RX_MULTICAST		2
 | |
| #define	RX_PROMISCUOUS		4
 | |
| 
 | |
| #define	REG_TIMEOUT		(HZ)
 | |
| #define	PEGASUS_TX_TIMEOUT	(HZ*10)
 | |
| 
 | |
| #define	TX_UNDERRUN		0x80
 | |
| #define	EXCESSIVE_COL		0x40
 | |
| #define	LATE_COL		0x20
 | |
| #define	NO_CARRIER		0x10
 | |
| #define	LOSS_CARRIER		0x08
 | |
| #define	JABBER_TIMEOUT		0x04
 | |
| 
 | |
| #define	LINK_STATUS		0x01
 | |
| 
 | |
| #define	PEGASUS_REQT_READ	0xc0
 | |
| #define	PEGASUS_REQT_WRITE	0x40
 | |
| #define	PEGASUS_REQ_GET_REGS	0xf0
 | |
| #define	PEGASUS_REQ_SET_REGS	0xf1
 | |
| #define	PEGASUS_REQ_SET_REG	PEGASUS_REQ_SET_REGS
 | |
| 
 | |
| enum pegasus_registers {
 | |
| 	EthCtrl0 = 0,
 | |
| 	EthCtrl1 = 1,
 | |
| 	EthCtrl2 = 2,
 | |
| 	EthID = 0x10,
 | |
| 	Reg1d = 0x1d,
 | |
| 	EpromOffset = 0x20,
 | |
| 	EpromData = 0x21,	/* 0x21 low, 0x22 high byte */
 | |
| 	EpromCtrl = 0x23,
 | |
| 	PhyAddr = 0x25,
 | |
| 	PhyData = 0x26,		/* 0x26 low, 0x27 high byte */
 | |
| 	PhyCtrl = 0x28,
 | |
| 	UsbStst = 0x2a,
 | |
| 	EthTxStat0 = 0x2b,
 | |
| 	EthTxStat1 = 0x2c,
 | |
| 	EthRxStat = 0x2d,
 | |
| 	WakeupControl = 0x78,
 | |
| 	Reg7b = 0x7b,
 | |
| 	Gpio0 = 0x7e,
 | |
| 	Gpio1 = 0x7f,
 | |
| 	Reg81 = 0x81,
 | |
| };
 | |
| 
 | |
| 
 | |
| typedef struct pegasus {
 | |
| 	struct usb_device	*usb;
 | |
| 	struct usb_interface	*intf;
 | |
| 	struct net_device	*net;
 | |
| 	struct net_device_stats	stats;
 | |
| 	struct mii_if_info	mii;
 | |
| 	unsigned		flags;
 | |
| 	unsigned		features;
 | |
| 	u32			msg_enable;
 | |
| 	u32			wolopts;
 | |
| 	int			dev_index;
 | |
| 	int			intr_interval;
 | |
| 	struct tasklet_struct	rx_tl;
 | |
| 	struct delayed_work	carrier_check;
 | |
| 	struct urb		*rx_urb, *tx_urb, *intr_urb;
 | |
| 	struct sk_buff		*rx_skb;
 | |
| 	int			chip;
 | |
| 	unsigned char		intr_buff[8];
 | |
| 	__u8			tx_buff[PEGASUS_MTU];
 | |
| 	__u8			eth_regs[4];
 | |
| 	__u8			phy;
 | |
| 	__u8			gpio_res;
 | |
| } pegasus_t;
 | |
| 
 | |
| 
 | |
| struct usb_eth_dev {
 | |
| 	char	*name;
 | |
| 	__u16	vendor;
 | |
| 	__u16	device;
 | |
| 	__u32	private; /* LSB is gpio reset value */
 | |
| };
 | |
| 
 | |
| #define	VENDOR_3COM		0x0506
 | |
| #define	VENDOR_ABOCOM		0x07b8
 | |
| #define	VENDOR_ACCTON		0x083a
 | |
| #define	VENDOR_ADMTEK		0x07a6
 | |
| #define	VENDOR_AEILAB		0x3334
 | |
| #define	VENDOR_ALLIEDTEL	0x07c9
 | |
| #define	VENDOR_ATEN		0x0557
 | |
| #define	VENDOR_BELKIN		0x050d
 | |
| #define	VENDOR_BILLIONTON	0x08dd
 | |
| #define	VENDOR_COMPAQ		0x049f
 | |
| #define	VENDOR_COREGA		0x07aa
 | |
| #define	VENDOR_DLINK		0x2001
 | |
| #define	VENDOR_ELCON		0x0db7
 | |
| #define	VENDOR_ELECOM		0x056e
 | |
| #define	VENDOR_ELSA		0x05cc
 | |
| #define	VENDOR_GIGABYTE		0x1044
 | |
| #define	VENDOR_HAWKING		0x0e66
 | |
| #define	VENDOR_HP		0x03f0
 | |
| #define	VENDOR_IODATA		0x04bb
 | |
| #define	VENDOR_KINGSTON		0x0951
 | |
| #define	VENDOR_LANEED		0x056e
 | |
| #define	VENDOR_LINKSYS		0x066b
 | |
| #define	VENDOR_LINKSYS2		0x077b
 | |
| #define	VENDOR_MELCO		0x0411
 | |
| #define	VENDOR_MICROSOFT	0x045e
 | |
| #define	VENDOR_MOBILITY		0x1342
 | |
| #define	VENDOR_NETGEAR		0x0846
 | |
| #define	VENDOR_OCT		0x0b39
 | |
| #define	VENDOR_SMARTBRIDGES	0x08d1
 | |
| #define	VENDOR_SMC		0x0707
 | |
| #define	VENDOR_SOHOWARE		0x15e8
 | |
| #define	VENDOR_SIEMENS		0x067c
 | |
| 
 | |
| 
 | |
| #else	/* PEGASUS_DEV */
 | |
| 
 | |
| PEGASUS_DEV("3Com USB Ethernet 3C460B", VENDOR_3COM, 0x4601,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("ATEN USB Ethernet UC-110T", VENDOR_ATEN, 0x2007,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("USB HPNA/Ethernet", VENDOR_ABOCOM, 0x110c,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II | HAS_HOME_PNA)
 | |
| PEGASUS_DEV("USB HPNA/Ethernet", VENDOR_ABOCOM, 0x4104,
 | |
| 		DEFAULT_GPIO_RESET | HAS_HOME_PNA)
 | |
| PEGASUS_DEV("USB HPNA/Ethernet", VENDOR_ABOCOM, 0x4004,
 | |
| 		DEFAULT_GPIO_RESET | HAS_HOME_PNA)
 | |
| PEGASUS_DEV("USB HPNA/Ethernet", VENDOR_ABOCOM, 0x4007,
 | |
| 		DEFAULT_GPIO_RESET | HAS_HOME_PNA)
 | |
| PEGASUS_DEV("USB 10/100 Fast Ethernet", VENDOR_ABOCOM, 0x4102,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("USB 10/100 Fast Ethernet", VENDOR_ABOCOM, 0x4002,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("USB 10/100 Fast Ethernet", VENDOR_ABOCOM, 0x400b,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("USB 10/100 Fast Ethernet", VENDOR_ABOCOM, 0x400c,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("USB 10/100 Fast Ethernet", VENDOR_ABOCOM, 0xabc1,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("USB 10/100 Fast Ethernet", VENDOR_ABOCOM, 0x200c,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("Accton USB 10/100 Ethernet Adapter", VENDOR_ACCTON, 0x1046,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("SpeedStream USB 10/100 Ethernet", VENDOR_ACCTON, 0x5046,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("Philips USB 10/100 Ethernet", VENDOR_ACCTON, 0xb004,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("ADMtek ADM8511 \"Pegasus II\" USB Ethernet",
 | |
| 		VENDOR_ADMTEK, 0x8511,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II | HAS_HOME_PNA)
 | |
| PEGASUS_DEV("ADMtek ADM8513 \"Pegasus II\" USB Ethernet",
 | |
| 		VENDOR_ADMTEK, 0x8513,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("ADMtek ADM8515 \"Pegasus II\" USB-2.0 Ethernet",
 | |
| 		VENDOR_ADMTEK, 0x8515,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("ADMtek AN986 \"Pegasus\" USB Ethernet (evaluation board)",
 | |
| 		VENDOR_ADMTEK, 0x0986,
 | |
| 		DEFAULT_GPIO_RESET | HAS_HOME_PNA)
 | |
| PEGASUS_DEV("AN986A USB MAC", VENDOR_ADMTEK, 1986,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("AEI USB Fast Ethernet Adapter", VENDOR_AEILAB, 0x1701,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("Allied Telesyn Int. AT-USB100", VENDOR_ALLIEDTEL, 0xb100,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| /*
 | |
|  * Distinguish between this Belkin adaptor and the Belkin bluetooth adaptors
 | |
|  * with the same product IDs by checking the device class too.
 | |
|  */
 | |
| PEGASUS_DEV_CLASS("Belkin F5D5050 USB Ethernet", VENDOR_BELKIN, 0x0121, 0x00,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("Belkin F5U122 10/100 USB Ethernet", VENDOR_BELKIN, 0x0122,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("Billionton USB-100", VENDOR_BILLIONTON, 0x0986,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("Billionton USBLP-100", VENDOR_BILLIONTON, 0x0987,
 | |
| 		DEFAULT_GPIO_RESET | HAS_HOME_PNA)
 | |
| PEGASUS_DEV("iPAQ Networking 10/100 USB", VENDOR_COMPAQ, 0x8511,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("Billionton USBEL-100", VENDOR_BILLIONTON, 0x0988,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("Billionton USBE-100", VENDOR_BILLIONTON, 0x8511,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("Corega FEther USB-TX", VENDOR_COREGA, 0x0004,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("Corega FEther USB-TXS", VENDOR_COREGA, 0x000d,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("D-Link DSB-650TX", VENDOR_DLINK, 0x4001,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("D-Link DSB-650TX", VENDOR_DLINK, 0x4002,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("D-Link DSB-650TX", VENDOR_DLINK, 0x4102,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("D-Link DSB-650TX", VENDOR_DLINK, 0x400b,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("D-Link DSB-650TX", VENDOR_DLINK, 0x200c,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("D-Link DSB-650TX(PNA)", VENDOR_DLINK, 0x4003,
 | |
| 		DEFAULT_GPIO_RESET | HAS_HOME_PNA)
 | |
| PEGASUS_DEV("D-Link DSB-650", VENDOR_DLINK, 0xabc1,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("GOLDPFEIL USB Adapter", VENDOR_ELCON, 0x0002,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II | HAS_HOME_PNA)
 | |
| PEGASUS_DEV("ELECOM USB Ethernet LD-USB20", VENDOR_ELECOM,  0x4010,
 | |
| 		DEFAULT_GPIO_RESET  | PEGASUS_II)
 | |
| PEGASUS_DEV("EasiDock Ethernet", VENDOR_MOBILITY, 0x0304,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("Elsa Micolink USB2Ethernet", VENDOR_ELSA, 0x3000,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("GIGABYTE GN-BR402W Wireless Router", VENDOR_GIGABYTE, 0x8002,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("Hawking UF100 10/100 Ethernet", VENDOR_HAWKING, 0x400c,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("HP hn210c Ethernet USB", VENDOR_HP, 0x811c,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("IO DATA USB ET/TX", VENDOR_IODATA, 0x0904,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("IO DATA USB ET/TX-S", VENDOR_IODATA, 0x0913,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("IO DATA USB ETX-US2", VENDOR_IODATA, 0x093a,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("Kingston KNU101TX Ethernet", VENDOR_KINGSTON, 0x000a,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("LANEED USB Ethernet LD-USB/TX", VENDOR_LANEED, 0x4002,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("LANEED USB Ethernet LD-USBL/TX", VENDOR_LANEED, 0x4005,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("LANEED USB Ethernet LD-USB/TX", VENDOR_LANEED, 0x400b,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("LANEED USB Ethernet LD-USB/T", VENDOR_LANEED, 0xabc1,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("LANEED USB Ethernet LD-USB/TX", VENDOR_LANEED, 0x200c,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("Linksys USB10TX", VENDOR_LINKSYS, 0x2202,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("Linksys USB100TX", VENDOR_LINKSYS, 0x2203,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("Linksys USB100TX", VENDOR_LINKSYS, 0x2204,
 | |
| 		DEFAULT_GPIO_RESET | HAS_HOME_PNA)
 | |
| PEGASUS_DEV("Linksys USB10T Ethernet Adapter", VENDOR_LINKSYS, 0x2206,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("Linksys USBVPN1", VENDOR_LINKSYS2, 0x08b4,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("Linksys USB USB100TX", VENDOR_LINKSYS, 0x400b,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("Linksys USB10TX", VENDOR_LINKSYS, 0x200c,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("MELCO/BUFFALO LUA-TX", VENDOR_MELCO, 0x0001,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("MELCO/BUFFALO LUA-TX", VENDOR_MELCO, 0x0005,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("MELCO/BUFFALO LUA2-TX", VENDOR_MELCO, 0x0009,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("Microsoft MN-110", VENDOR_MICROSOFT, 0x007a,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("NETGEAR FA101", VENDOR_NETGEAR, 0x1020,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("OCT Inc.", VENDOR_OCT, 0x0109,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("OCT USB TO Ethernet", VENDOR_OCT, 0x0901,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("smartNIC 2 PnP Adapter", VENDOR_SMARTBRIDGES, 0x0003,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("SMC 202 USB Ethernet", VENDOR_SMC, 0x0200,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("SMC 2206 USB Ethernet", VENDOR_SMC, 0x0201,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("SOHOware NUB100 Ethernet", VENDOR_SOHOWARE, 0x9100,
 | |
| 		DEFAULT_GPIO_RESET)
 | |
| PEGASUS_DEV("SOHOware NUB110 Ethernet", VENDOR_SOHOWARE, 0x9110,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| PEGASUS_DEV("SpeedStream USB 10/100 Ethernet", VENDOR_SIEMENS, 0x1001,
 | |
| 		DEFAULT_GPIO_RESET | PEGASUS_II)
 | |
| 
 | |
| 
 | |
| #endif	/* PEGASUS_DEV */
 |