arcnet: restoring support for multiple Sohard Arcnet cards
[ Upstream commit6b17a597fc
] Probe of Sohard Arcnet cards fails, if 2 or more cards are installed in a system. See kernel log: [ 2.759203] arcnet: arcnet loaded [ 2.763648] arcnet:com20020: COM20020 chipset support (by David Woodhouse et al.) [ 2.770585] arcnet:com20020_pci: COM20020 PCI support [ 2.772295] com20020 0000:02:00.0: enabling device (0000 -> 0003) [ 2.772354] (unnamed net_device) (uninitialized): PLX-PCI Controls ... [ 3.071301] com20020 0000:02:00.0 arc0-0 (uninitialized): PCI COM20020: station FFh found at F080h, IRQ 101. [ 3.071305] com20020 0000:02:00.0 arc0-0 (uninitialized): Using CKP 64 - data rate 2.5 Mb/s [ 3.071534] com20020 0000:07:00.0: enabling device (0000 -> 0003) [ 3.071581] (unnamed net_device) (uninitialized): PLX-PCI Controls ... [ 3.369501] com20020 0000:07:00.0: Led pci:green:tx:0-0 renamed to pci:green:tx:0-0_1 due to name collision [ 3.369535] com20020 0000:07:00.0: Led pci:red:recon:0-0 renamed to pci:red:recon:0-0_1 due to name collision [ 3.370586] com20020 0000:07:00.0 arc0-0 (uninitialized): PCI COM20020: station E1h found at C000h, IRQ 35. [ 3.370589] com20020 0000:07:00.0 arc0-0 (uninitialized): Using CKP 64 - data rate 2.5 Mb/s [ 3.370608] com20020: probe of 0000:07:00.0 failed with error -5 commit5ef216c1f8
("arcnet: com20020-pci: add rotary index support") changes the device name of all COM20020 based PCI cards, even if only some cards support this: snprintf(dev->name, sizeof(dev->name), "arc%d-%d", dev->dev_id, i); The error happens because all Sohard Arcnet cards would be called arc0-0, since the Sohard Arcnet cards don't have a PLX rotary coder. I.e. EAE Arcnet cards have a PLX rotary coder, which sets the first decimal, ensuring unique devices names. This patch adds two new card feature flags to indicate which cards support LEDs and the PLX rotary coder. For EAE based cards the names still depend on the PLX rotary coder (untested, since missing EAE hardware). For Sohard based cards, this patch will result in devices being called arc0, arc1, ... (tested). Signed-off-by: Thomas Reichinger <thomas.reichinger@sohard.de> Fixes:5ef216c1f8
("arcnet: com20020-pci: add rotary index support") Link: https://lore.kernel.org/r/20231130113503.6812-1-thomas.reichinger@sohard.de Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
3c32379695
commit
8d034da825
|
@ -186,6 +186,8 @@ do { \
|
||||||
#define ARC_IS_5MBIT 1 /* card default speed is 5MBit */
|
#define ARC_IS_5MBIT 1 /* card default speed is 5MBit */
|
||||||
#define ARC_CAN_10MBIT 2 /* card uses COM20022, supporting 10MBit,
|
#define ARC_CAN_10MBIT 2 /* card uses COM20022, supporting 10MBit,
|
||||||
but default is 2.5MBit. */
|
but default is 2.5MBit. */
|
||||||
|
#define ARC_HAS_LED 4 /* card has software controlled LEDs */
|
||||||
|
#define ARC_HAS_ROTARY 8 /* card has rotary encoder */
|
||||||
|
|
||||||
/* information needed to define an encapsulation driver */
|
/* information needed to define an encapsulation driver */
|
||||||
struct ArcProto {
|
struct ArcProto {
|
||||||
|
|
|
@ -213,12 +213,13 @@ static int com20020pci_probe(struct pci_dev *pdev,
|
||||||
if (!strncmp(ci->name, "EAE PLX-PCI FB2", 15))
|
if (!strncmp(ci->name, "EAE PLX-PCI FB2", 15))
|
||||||
lp->backplane = 1;
|
lp->backplane = 1;
|
||||||
|
|
||||||
/* Get the dev_id from the PLX rotary coder */
|
if (ci->flags & ARC_HAS_ROTARY) {
|
||||||
if (!strncmp(ci->name, "EAE PLX-PCI MA1", 15))
|
/* Get the dev_id from the PLX rotary coder */
|
||||||
dev_id_mask = 0x3;
|
if (!strncmp(ci->name, "EAE PLX-PCI MA1", 15))
|
||||||
dev->dev_id = (inb(priv->misc + ci->rotary) >> 4) & dev_id_mask;
|
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);
|
snprintf(dev->name, sizeof(dev->name), "arc%d-%d", dev->dev_id, i);
|
||||||
|
}
|
||||||
|
|
||||||
if (arcnet_inb(ioaddr, COM20020_REG_R_STATUS) == 0xFF) {
|
if (arcnet_inb(ioaddr, COM20020_REG_R_STATUS) == 0xFF) {
|
||||||
pr_err("IO address %Xh is empty!\n", ioaddr);
|
pr_err("IO address %Xh is empty!\n", ioaddr);
|
||||||
|
@ -230,6 +231,10 @@ static int com20020pci_probe(struct pci_dev *pdev,
|
||||||
goto err_free_arcdev;
|
goto err_free_arcdev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = com20020_found(dev, IRQF_SHARED);
|
||||||
|
if (ret)
|
||||||
|
goto err_free_arcdev;
|
||||||
|
|
||||||
card = devm_kzalloc(&pdev->dev, sizeof(struct com20020_dev),
|
card = devm_kzalloc(&pdev->dev, sizeof(struct com20020_dev),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!card) {
|
if (!card) {
|
||||||
|
@ -239,41 +244,39 @@ static int com20020pci_probe(struct pci_dev *pdev,
|
||||||
|
|
||||||
card->index = i;
|
card->index = i;
|
||||||
card->pci_priv = priv;
|
card->pci_priv = priv;
|
||||||
card->tx_led.brightness_set = led_tx_set;
|
|
||||||
card->tx_led.default_trigger = devm_kasprintf(&pdev->dev,
|
|
||||||
GFP_KERNEL, "arc%d-%d-tx",
|
|
||||||
dev->dev_id, i);
|
|
||||||
card->tx_led.name = devm_kasprintf(&pdev->dev, GFP_KERNEL,
|
|
||||||
"pci:green:tx:%d-%d",
|
|
||||||
dev->dev_id, i);
|
|
||||||
|
|
||||||
card->tx_led.dev = &dev->dev;
|
if (ci->flags & ARC_HAS_LED) {
|
||||||
card->recon_led.brightness_set = led_recon_set;
|
card->tx_led.brightness_set = led_tx_set;
|
||||||
card->recon_led.default_trigger = devm_kasprintf(&pdev->dev,
|
card->tx_led.default_trigger = devm_kasprintf(&pdev->dev,
|
||||||
GFP_KERNEL, "arc%d-%d-recon",
|
GFP_KERNEL, "arc%d-%d-tx",
|
||||||
dev->dev_id, i);
|
dev->dev_id, i);
|
||||||
card->recon_led.name = devm_kasprintf(&pdev->dev, GFP_KERNEL,
|
card->tx_led.name = devm_kasprintf(&pdev->dev, GFP_KERNEL,
|
||||||
"pci:red:recon:%d-%d",
|
"pci:green:tx:%d-%d",
|
||||||
dev->dev_id, i);
|
dev->dev_id, i);
|
||||||
card->recon_led.dev = &dev->dev;
|
|
||||||
|
card->tx_led.dev = &dev->dev;
|
||||||
|
card->recon_led.brightness_set = led_recon_set;
|
||||||
|
card->recon_led.default_trigger = devm_kasprintf(&pdev->dev,
|
||||||
|
GFP_KERNEL, "arc%d-%d-recon",
|
||||||
|
dev->dev_id, i);
|
||||||
|
card->recon_led.name = devm_kasprintf(&pdev->dev, GFP_KERNEL,
|
||||||
|
"pci:red:recon:%d-%d",
|
||||||
|
dev->dev_id, i);
|
||||||
|
card->recon_led.dev = &dev->dev;
|
||||||
|
|
||||||
|
ret = devm_led_classdev_register(&pdev->dev, &card->tx_led);
|
||||||
|
if (ret)
|
||||||
|
goto err_free_arcdev;
|
||||||
|
|
||||||
|
ret = devm_led_classdev_register(&pdev->dev, &card->recon_led);
|
||||||
|
if (ret)
|
||||||
|
goto err_free_arcdev;
|
||||||
|
|
||||||
|
dev_set_drvdata(&dev->dev, card);
|
||||||
|
devm_arcnet_led_init(dev, dev->dev_id, i);
|
||||||
|
}
|
||||||
|
|
||||||
card->dev = dev;
|
card->dev = dev;
|
||||||
|
|
||||||
ret = devm_led_classdev_register(&pdev->dev, &card->tx_led);
|
|
||||||
if (ret)
|
|
||||||
goto err_free_arcdev;
|
|
||||||
|
|
||||||
ret = devm_led_classdev_register(&pdev->dev, &card->recon_led);
|
|
||||||
if (ret)
|
|
||||||
goto err_free_arcdev;
|
|
||||||
|
|
||||||
dev_set_drvdata(&dev->dev, card);
|
|
||||||
|
|
||||||
ret = com20020_found(dev, IRQF_SHARED);
|
|
||||||
if (ret)
|
|
||||||
goto err_free_arcdev;
|
|
||||||
|
|
||||||
devm_arcnet_led_init(dev, dev->dev_id, i);
|
|
||||||
|
|
||||||
list_add(&card->list, &priv->list_dev);
|
list_add(&card->list, &priv->list_dev);
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -329,7 +332,7 @@ static struct com20020_pci_card_info card_info_5mbit = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct com20020_pci_card_info card_info_sohard = {
|
static struct com20020_pci_card_info card_info_sohard = {
|
||||||
.name = "PLX-PCI",
|
.name = "SOHARD SH ARC-PCI",
|
||||||
.devcount = 1,
|
.devcount = 1,
|
||||||
/* SOHARD needs PCI base addr 4 */
|
/* SOHARD needs PCI base addr 4 */
|
||||||
.chan_map_tbl = {
|
.chan_map_tbl = {
|
||||||
|
@ -364,7 +367,7 @@ static struct com20020_pci_card_info card_info_eae_arc1 = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
.rotary = 0x0,
|
.rotary = 0x0,
|
||||||
.flags = ARC_CAN_10MBIT,
|
.flags = ARC_HAS_ROTARY | ARC_HAS_LED | ARC_CAN_10MBIT,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct com20020_pci_card_info card_info_eae_ma1 = {
|
static struct com20020_pci_card_info card_info_eae_ma1 = {
|
||||||
|
@ -396,7 +399,7 @@ static struct com20020_pci_card_info card_info_eae_ma1 = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
.rotary = 0x0,
|
.rotary = 0x0,
|
||||||
.flags = ARC_CAN_10MBIT,
|
.flags = ARC_HAS_ROTARY | ARC_HAS_LED | ARC_CAN_10MBIT,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct com20020_pci_card_info card_info_eae_fb2 = {
|
static struct com20020_pci_card_info card_info_eae_fb2 = {
|
||||||
|
@ -421,7 +424,7 @@ static struct com20020_pci_card_info card_info_eae_fb2 = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
.rotary = 0x0,
|
.rotary = 0x0,
|
||||||
.flags = ARC_CAN_10MBIT,
|
.flags = ARC_HAS_ROTARY | ARC_HAS_LED | ARC_CAN_10MBIT,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct pci_device_id com20020pci_id_table[] = {
|
static const struct pci_device_id com20020pci_id_table[] = {
|
||||||
|
|
Loading…
Reference in New Issue