diff options
Diffstat (limited to 'drivers/net/arcnet/com20020-pci.c')
| -rw-r--r-- | drivers/net/arcnet/com20020-pci.c | 64 | 
1 files changed, 62 insertions, 2 deletions
| diff --git a/drivers/net/arcnet/com20020-pci.c b/drivers/net/arcnet/com20020-pci.c index 239de38fbd6a..2d956cb59d06 100644 --- a/drivers/net/arcnet/com20020-pci.c +++ b/drivers/net/arcnet/com20020-pci.c @@ -93,6 +93,27 @@ static void led_recon_set(struct led_classdev *led_cdev,  	outb(!!value, priv->misc + ci->leds[card->index].red);  } +static ssize_t backplane_mode_show(struct device *dev, +				   struct device_attribute *attr, +				   char *buf) +{ +	struct net_device *net_dev = to_net_dev(dev); +	struct arcnet_local *lp = netdev_priv(net_dev); + +	return sprintf(buf, "%s\n", lp->backplane ? "true" : "false"); +} +static DEVICE_ATTR_RO(backplane_mode); + +static struct attribute *com20020_state_attrs[] = { +	&dev_attr_backplane_mode.attr, +	NULL, +}; + +static struct attribute_group com20020_state_group = { +	.name = NULL, +	.attrs = com20020_state_attrs, +}; +  static void com20020pci_remove(struct pci_dev *pdev);  static int com20020pci_probe(struct pci_dev *pdev, @@ -135,6 +156,7 @@ static int com20020pci_probe(struct pci_dev *pdev,  	for (i = 0; i < ci->devcount; i++) {  		struct com20020_pci_channel_map *cm = &ci->chan_map_tbl[i];  		struct com20020_dev *card; +		int dev_id_mask = 0xf;  		dev = alloc_arcdev(device);  		if (!dev) { @@ -166,8 +188,10 @@ static int com20020pci_probe(struct pci_dev *pdev,  		arcnet_outb(0x00, ioaddr, COM20020_REG_W_COMMAND);  		arcnet_inb(ioaddr, COM20020_REG_R_DIAGSTAT); +		SET_NETDEV_DEV(dev, &pdev->dev);  		dev->base_addr = ioaddr;  		dev->dev_addr[0] = node; +		dev->sysfs_groups[0] = &com20020_state_group;  		dev->irq = pdev->irq;  		lp->card_name = "PCI COM20020";  		lp->card_flags = ci->flags; @@ -177,10 +201,15 @@ static int com20020pci_probe(struct pci_dev *pdev,  		lp->timeout = timeout;  		lp->hw.owner = THIS_MODULE; +		lp->backplane = (inb(priv->misc) >> (2 + i)) & 0x1; + +		if (!strncmp(ci->name, "EAE PLX-PCI FB2", 15)) +			lp->backplane = 1; +  		/* Get the dev_id from the PLX rotary coder */  		if (!strncmp(ci->name, "EAE PLX-PCI MA1", 15)) -			dev->dev_id = 0xc; -		dev->dev_id ^= inb(priv->misc + ci->rotary) >> 4; +			dev_id_mask = 0x3; +		dev->dev_id = (inb(priv->misc + ci->rotary) >> 4) & dev_id_mask;  		snprintf(dev->name, sizeof(dev->name), "arc%d-%d", dev->dev_id, i); @@ -361,6 +390,31 @@ static struct com20020_pci_card_info card_info_eae_ma1 = {  	.flags = ARC_CAN_10MBIT,  }; +static struct com20020_pci_card_info card_info_eae_fb2 = { +	.name = "EAE PLX-PCI FB2", +	.devcount = 1, +	.chan_map_tbl = { +		{ +			.bar = 2, +			.offset = 0x00, +			.size = 0x08, +		}, +	}, +	.misc_map = { +		.bar = 2, +		.offset = 0x10, +		.size = 0x04, +	}, +	.leds = { +		{ +			.green = 0x0, +			.red = 0x1, +		}, +	}, +	.rotary = 0x0, +	.flags = ARC_CAN_10MBIT, +}; +  static const struct pci_device_id com20020pci_id_table[] = {  	{  		0x1571, 0xa001, @@ -507,6 +561,12 @@ static const struct pci_device_id com20020pci_id_table[] = {  		(kernel_ulong_t)&card_info_eae_ma1  	},  	{ +		0x10B5, 0x9050, +		0x10B5, 0x3294, +		0, 0, +		(kernel_ulong_t)&card_info_eae_fb2 +	}, +	{  		0x14BA, 0x6000,  		PCI_ANY_ID, PCI_ANY_ID,  		0, 0, | 
