diff options
Diffstat (limited to 'drivers/atm/nicstar.c')
| -rw-r--r-- | drivers/atm/nicstar.c | 102 | 
1 files changed, 33 insertions, 69 deletions
diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c index 2f3516b7f11..9988ac98b6d 100644 --- a/drivers/atm/nicstar.c +++ b/drivers/atm/nicstar.c @@ -51,7 +51,8 @@  #include <linux/idr.h>  #include <asm/io.h>  #include <asm/uaccess.h> -#include <asm/atomic.h> +#include <linux/atomic.h> +#include <linux/etherdevice.h>  #include "nicstar.h"  #ifdef CONFIG_ATM_NICSTAR_USE_SUNI  #include "suni.h" @@ -121,8 +122,8 @@  static u32 ns_read_sram(ns_dev * card, u32 sram_address);  static void ns_write_sram(ns_dev * card, u32 sram_address, u32 * value,  			  int count); -static int __devinit ns_init_card(int i, struct pci_dev *pcidev); -static void __devinit ns_init_card_error(ns_dev * card, int error); +static int ns_init_card(int i, struct pci_dev *pcidev); +static void ns_init_card_error(ns_dev * card, int error);  static scq_info *get_scq(ns_dev *card, int size, u32 scd);  static void free_scq(ns_dev *card, scq_info * scq, struct atm_vcc *vcc);  static void push_rxbufs(ns_dev *, struct sk_buff *); @@ -153,7 +154,6 @@ static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user * arg);  static void which_list(ns_dev * card, struct sk_buff *skb);  #endif  static void ns_poll(unsigned long arg); -static int ns_parse_mac(char *mac, unsigned char *esi);  static void ns_phy_put(struct atm_dev *dev, unsigned char value,  		       unsigned long addr);  static unsigned char ns_phy_get(struct atm_dev *dev, unsigned long addr); @@ -180,8 +180,8 @@ MODULE_LICENSE("GPL");  /* Functions */ -static int __devinit nicstar_init_one(struct pci_dev *pcidev, -				      const struct pci_device_id *ent) +static int nicstar_init_one(struct pci_dev *pcidev, +			    const struct pci_device_id *ent)  {  	static int index = -1;  	unsigned int error; @@ -200,7 +200,7 @@ err_out:  	return -ENODEV;  } -static void __devexit nicstar_remove_one(struct pci_dev *pcidev) +static void nicstar_remove_one(struct pci_dev *pcidev)  {  	int i, j;  	ns_dev *card = pci_get_drvdata(pcidev); @@ -251,7 +251,6 @@ static void __devexit nicstar_remove_one(struct pci_dev *pcidev)  		if (card->scd2vc[j] != NULL)  			free_scq(card, card->scd2vc[j]->scq, card->scd2vc[j]->tx_vcc);  	} -	idr_remove_all(&card->idr);  	idr_destroy(&card->idr);  	pci_free_consistent(card->pcidev, NS_RSQSIZE + NS_RSQ_ALIGNMENT,  			    card->rsq.org, card->rsq.dma); @@ -262,7 +261,7 @@ static void __devexit nicstar_remove_one(struct pci_dev *pcidev)  	kfree(card);  } -static struct pci_device_id nicstar_pci_tbl[] __devinitdata = { +static struct pci_device_id nicstar_pci_tbl[] = {  	{ PCI_VDEVICE(IDT, PCI_DEVICE_ID_IDT_IDT77201), 0 },  	{0,}			/* terminate list */  }; @@ -273,7 +272,7 @@ static struct pci_driver nicstar_driver = {  	.name = "nicstar",  	.id_table = nicstar_pci_tbl,  	.probe = nicstar_init_one, -	.remove = __devexit_p(nicstar_remove_one), +	.remove = nicstar_remove_one,  };  static int __init nicstar_init(void) @@ -351,7 +350,7 @@ static void ns_write_sram(ns_dev * card, u32 sram_address, u32 * value,  	spin_unlock_irqrestore(&card->res_lock, flags);  } -static int __devinit ns_init_card(int i, struct pci_dev *pcidev) +static int ns_init_card(int i, struct pci_dev *pcidev)  {  	int j;  	struct ns_dev *card = NULL; @@ -640,9 +639,9 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)  	card->hbnr.init = NUM_HB;  	card->hbnr.max = MAX_HB; -	card->sm_handle = 0x00000000; +	card->sm_handle = NULL;  	card->sm_addr = 0x00000000; -	card->lg_handle = 0x00000000; +	card->lg_handle = NULL;  	card->lg_addr = 0x00000000;  	card->efbie = 1;	/* To prevent push_rxbufs from enabling the interrupt */ @@ -771,7 +770,8 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)  	}  	/* Register device */ -	card->atmdev = atm_dev_register("nicstar", &atm_ops, -1, NULL); +	card->atmdev = atm_dev_register("nicstar", &card->pcidev->dev, &atm_ops, +					-1, NULL);  	if (card->atmdev == NULL) {  		printk("nicstar%d: can't register device.\n", i);  		error = 17; @@ -779,11 +779,10 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)  		return error;  	} -	if (ns_parse_mac(mac[i], card->atmdev->esi)) { +	if (mac[i] == NULL || !mac_pton(mac[i], card->atmdev->esi)) {  		nicstar_read_eprom(card->membase, NICSTAR_EPROM_MAC_ADDR_OFFSET,  				   card->atmdev->esi, 6); -		if (memcmp(card->atmdev->esi, "\x00\x00\x00\x00\x00\x00", 6) == -		    0) { +		if (ether_addr_equal(card->atmdev->esi, "\x00\x00\x00\x00\x00\x00")) {  			nicstar_read_eprom(card->membase,  					   NICSTAR_EPROM_MAC_ADDR_OFFSET_ALT,  					   card->atmdev->esi, 6); @@ -820,7 +819,7 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)  	return error;  } -static void __devinit ns_init_card_error(ns_dev * card, int error) +static void ns_init_card_error(ns_dev *card, int error)  {  	if (error >= 17) {  		writel(0x00000000, card->membase + CFG); @@ -949,11 +948,10 @@ static void free_scq(ns_dev *card, scq_info *scq, struct atm_vcc *vcc)  static void push_rxbufs(ns_dev * card, struct sk_buff *skb)  {  	struct sk_buff *handle1, *handle2; -	u32 id1 = 0, id2 = 0; +	int id1, id2;  	u32 addr1, addr2;  	u32 stat;  	unsigned long flags; -	int err;  	/* *BARF* */  	handle2 = NULL; @@ -981,7 +979,7 @@ static void push_rxbufs(ns_dev * card, struct sk_buff *skb)  				addr2 = card->sm_addr;  				handle2 = card->sm_handle;  				card->sm_addr = 0x00000000; -				card->sm_handle = 0x00000000; +				card->sm_handle = NULL;  			} else {	/* (!sm_addr) */  				card->sm_addr = addr1; @@ -995,7 +993,7 @@ static void push_rxbufs(ns_dev * card, struct sk_buff *skb)  				addr2 = card->lg_addr;  				handle2 = card->lg_handle;  				card->lg_addr = 0x00000000; -				card->lg_handle = 0x00000000; +				card->lg_handle = NULL;  			} else {	/* (!lg_addr) */  				card->lg_addr = addr1; @@ -1026,23 +1024,12 @@ static void push_rxbufs(ns_dev * card, struct sk_buff *skb)  				card->lbfqc += 2;  		} -		do { -			if (!idr_pre_get(&card->idr, GFP_ATOMIC)) { -				printk(KERN_ERR -				       "nicstar%d: no free memory for idr\n", -				       card->index); -				goto out; -			} - -			if (!id1) -				err = idr_get_new_above(&card->idr, handle1, 0, &id1); - -			if (!id2 && err == 0) -				err = idr_get_new_above(&card->idr, handle2, 0, &id2); - -		} while (err == -EAGAIN); +		id1 = idr_alloc(&card->idr, handle1, 0, 0, GFP_ATOMIC); +		if (id1 < 0) +			goto out; -		if (err) +		id2 = idr_alloc(&card->idr, handle2, 0, 0, GFP_ATOMIC); +		if (id2 < 0)  			goto out;  		spin_lock_irqsave(&card->res_lock, flags); @@ -1752,10 +1739,10 @@ static int push_scqe(ns_dev * card, vc_map * vc, scq_info * scq, ns_scqe * tbd,  		}  		scq->full = 1; -		spin_unlock_irqrestore(&scq->lock, flags); -		interruptible_sleep_on_timeout(&scq->scqfull_waitq, -					       SCQFULL_TIMEOUT); -		spin_lock_irqsave(&scq->lock, flags); +		wait_event_interruptible_lock_irq_timeout(scq->scqfull_waitq, +							  scq->tail != scq->next, +							  scq->lock, +							  SCQFULL_TIMEOUT);  		if (scq->full) {  			spin_unlock_irqrestore(&scq->lock, flags); @@ -1802,10 +1789,10 @@ static int push_scqe(ns_dev * card, vc_map * vc, scq_info * scq, ns_scqe * tbd,  			scq->full = 1;  			if (has_run++)  				break; -			spin_unlock_irqrestore(&scq->lock, flags); -			interruptible_sleep_on_timeout(&scq->scqfull_waitq, -						       SCQFULL_TIMEOUT); -			spin_lock_irqsave(&scq->lock, flags); +			wait_event_interruptible_lock_irq_timeout(scq->scqfull_waitq, +								  scq->tail != scq->next, +								  scq->lock, +								  SCQFULL_TIMEOUT);  		}  		if (!scq->full) { @@ -2814,29 +2801,6 @@ static void ns_poll(unsigned long arg)  	PRINTK("nicstar: Leaving ns_poll().\n");  } -static int ns_parse_mac(char *mac, unsigned char *esi) -{ -	int i, j; -	short byte1, byte0; - -	if (mac == NULL || esi == NULL) -		return -1; -	j = 0; -	for (i = 0; i < 6; i++) { -		if ((byte1 = hex_to_bin(mac[j++])) < 0) -			return -1; -		if ((byte0 = hex_to_bin(mac[j++])) < 0) -			return -1; -		esi[i] = (unsigned char)(byte1 * 16 + byte0); -		if (i < 5) { -			if (mac[j++] != ':') -				return -1; -		} -	} -	return 0; -} - -  static void ns_phy_put(struct atm_dev *dev, unsigned char value,  		       unsigned long addr)  {  | 
