diff options
Diffstat (limited to 'drivers/net/can/sja1000/plx_pci.c')
| -rw-r--r-- | drivers/net/can/sja1000/plx_pci.c | 117 | 
1 files changed, 82 insertions, 35 deletions
diff --git a/drivers/net/can/sja1000/plx_pci.c b/drivers/net/can/sja1000/plx_pci.c index 437b5c716a2..ec39b7cb228 100644 --- a/drivers/net/can/sja1000/plx_pci.c +++ b/drivers/net/can/sja1000/plx_pci.c @@ -16,8 +16,7 @@   * GNU General Public License for more details.   *   * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * along with this program; if not, see <http://www.gnu.org/licenses/>.   */  #include <linux/kernel.h> @@ -43,7 +42,10 @@ MODULE_SUPPORTED_DEVICE("Adlink PCI-7841/cPCI-7841, "  			"TEWS TECHNOLOGIES TPMC810, "  			"esd CAN-PCI/CPCI/PCI104/200, "  			"esd CAN-PCI/PMC/266, " -			"esd CAN-PCIe/2000") +			"esd CAN-PCIe/2000, " +			"Connect Tech Inc. CANpro/104-Plus Opto (CRG001), " +			"IXXAT PC-I 04/PCI, " +			"ELCUS CAN-200-PCI")  MODULE_LICENSE("GPL v2");  #define PLX_PCI_MAX_CHAN 2 @@ -121,11 +123,23 @@ struct plx_pci_card {  #define ESD_PCI_SUB_SYS_ID_PCIE2000	0x0200  #define ESD_PCI_SUB_SYS_ID_PCI104200	0x0501 +#define CAN200PCI_DEVICE_ID		0x9030 +#define CAN200PCI_VENDOR_ID		0x10b5 +#define CAN200PCI_SUB_DEVICE_ID		0x0301 +#define CAN200PCI_SUB_VENDOR_ID		0xe1c5 + +#define IXXAT_PCI_VENDOR_ID		0x10b5 +#define IXXAT_PCI_DEVICE_ID		0x9050 +#define IXXAT_PCI_SUB_SYS_ID		0x2540 +  #define MARATHON_PCI_DEVICE_ID		0x2715  #define TEWS_PCI_VENDOR_ID		0x1498  #define TEWS_PCI_DEVICE_ID_TMPC810	0x032A +#define CTI_PCI_VENDOR_ID		0x12c4 +#define CTI_PCI_DEVICE_ID_CRG001	0x0900 +  static void plx_pci_reset_common(struct pci_dev *pdev);  static void plx_pci_reset_marathon(struct pci_dev *pdev);  static void plx9056_pci_reset_common(struct pci_dev *pdev); @@ -153,7 +167,7 @@ struct plx_pci_card_info {  	void (*reset_func)(struct pci_dev *pdev);  }; -static struct plx_pci_card_info plx_pci_card_info_adlink __devinitdata = { +static struct plx_pci_card_info plx_pci_card_info_adlink = {  	"Adlink PCI-7841/cPCI-7841", 2,  	PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR,  	{1, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x80, 0x80} }, @@ -161,7 +175,7 @@ static struct plx_pci_card_info plx_pci_card_info_adlink __devinitdata = {  	/* based on PLX9052 */  }; -static struct plx_pci_card_info plx_pci_card_info_adlink_se __devinitdata = { +static struct plx_pci_card_info plx_pci_card_info_adlink_se = {  	"Adlink PCI-7841/cPCI-7841 SE", 2,  	PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR,  	{0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x80, 0x80} }, @@ -169,7 +183,7 @@ static struct plx_pci_card_info plx_pci_card_info_adlink_se __devinitdata = {  	/* based on PLX9052 */  }; -static struct plx_pci_card_info plx_pci_card_info_esd200 __devinitdata = { +static struct plx_pci_card_info plx_pci_card_info_esd200 = {  	"esd CAN-PCI/CPCI/PCI104/200", 2,  	PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR,  	{0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x100, 0x80} }, @@ -177,7 +191,7 @@ static struct plx_pci_card_info plx_pci_card_info_esd200 __devinitdata = {  	/* based on PLX9030/9050 */  }; -static struct plx_pci_card_info plx_pci_card_info_esd266 __devinitdata = { +static struct plx_pci_card_info plx_pci_card_info_esd266 = {  	"esd CAN-PCI/PMC/266", 2,  	PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR,  	{0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x100, 0x80} }, @@ -185,7 +199,7 @@ static struct plx_pci_card_info plx_pci_card_info_esd266 __devinitdata = {  	/* based on PLX9056 */  }; -static struct plx_pci_card_info plx_pci_card_info_esd2000 __devinitdata = { +static struct plx_pci_card_info plx_pci_card_info_esd2000 = {  	"esd CAN-PCIe/2000", 2,  	PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR,  	{0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x100, 0x80} }, @@ -193,7 +207,15 @@ static struct plx_pci_card_info plx_pci_card_info_esd2000 __devinitdata = {  	/* based on PEX8311 */  }; -static struct plx_pci_card_info plx_pci_card_info_marathon __devinitdata = { +static struct plx_pci_card_info plx_pci_card_info_ixxat = { +	"IXXAT PC-I 04/PCI", 2, +	PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, +	{0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x200, 0x80} }, +	&plx_pci_reset_common +	/* based on PLX9050 */ +}; + +static struct plx_pci_card_info plx_pci_card_info_marathon = {  	"Marathon CAN-bus-PCI", 2,  	PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR,  	{0, 0x00, 0x00}, { {2, 0x00, 0x00}, {4, 0x00, 0x00} }, @@ -201,7 +223,7 @@ static struct plx_pci_card_info plx_pci_card_info_marathon __devinitdata = {  	/* based on PLX9052 */  }; -static struct plx_pci_card_info plx_pci_card_info_tews __devinitdata = { +static struct plx_pci_card_info plx_pci_card_info_tews = {  	"TEWS TECHNOLOGIES TPMC810", 2,  	PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR,  	{0, 0x00, 0x00}, { {2, 0x000, 0x80}, {2, 0x100, 0x80} }, @@ -209,6 +231,22 @@ static struct plx_pci_card_info plx_pci_card_info_tews __devinitdata = {  	/* based on PLX9030 */  }; +static struct plx_pci_card_info plx_pci_card_info_cti = { +	"Connect Tech Inc. CANpro/104-Plus Opto (CRG001)", 2, +	PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, +	{0, 0x00, 0x00}, { {2, 0x000, 0x80}, {2, 0x100, 0x80} }, +	&plx_pci_reset_common +	/* based on PLX9030 */ +}; + +static struct plx_pci_card_info plx_pci_card_info_elcus = { +	"Eclus CAN-200-PCI", 2, +	PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, +	{1, 0x00, 0x00}, { {2, 0x00, 0x80}, {3, 0x00, 0x80} }, +	&plx_pci_reset_common +	/* based on PLX9030 */ +}; +  static DEFINE_PCI_DEVICE_TABLE(plx_pci_tbl) = {  	{  		/* Adlink PCI-7841/cPCI-7841 */ @@ -267,6 +305,13 @@ static DEFINE_PCI_DEVICE_TABLE(plx_pci_tbl) = {  		(kernel_ulong_t)&plx_pci_card_info_esd2000  	},  	{ +		/* IXXAT PC-I 04/PCI card */ +		IXXAT_PCI_VENDOR_ID, IXXAT_PCI_DEVICE_ID, +		PCI_ANY_ID, IXXAT_PCI_SUB_SYS_ID, +		0, 0, +		(kernel_ulong_t)&plx_pci_card_info_ixxat +	}, +	{  		/* Marathon CAN-bus-PCI card */  		PCI_VENDOR_ID_PLX, MARATHON_PCI_DEVICE_ID,  		PCI_ANY_ID, PCI_ANY_ID, @@ -280,6 +325,20 @@ static DEFINE_PCI_DEVICE_TABLE(plx_pci_tbl) = {  		0, 0,  		(kernel_ulong_t)&plx_pci_card_info_tews  	}, +	{ +		/* Connect Tech Inc. CANpro/104-Plus Opto (CRG001) card */ +		PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030, +		CTI_PCI_VENDOR_ID, CTI_PCI_DEVICE_ID_CRG001, +		0, 0, +		(kernel_ulong_t)&plx_pci_card_info_cti +	}, +	{ +		/* Elcus CAN-200-PCI */ +		CAN200PCI_VENDOR_ID, CAN200PCI_DEVICE_ID, +		CAN200PCI_SUB_VENDOR_ID, CAN200PCI_SUB_DEVICE_ID, +		0, 0, +		(kernel_ulong_t)&plx_pci_card_info_elcus +	},  	{ 0,}  };  MODULE_DEVICE_TABLE(pci, plx_pci_tbl); @@ -309,20 +368,20 @@ static inline int plx_pci_check_sja1000(const struct sja1000_priv *priv)  	 */  	if ((priv->read_reg(priv, REG_CR) & REG_CR_BASICCAN_INITIAL_MASK) ==  	    REG_CR_BASICCAN_INITIAL && -	    (priv->read_reg(priv, REG_SR) == REG_SR_BASICCAN_INITIAL) && -	    (priv->read_reg(priv, REG_IR) == REG_IR_BASICCAN_INITIAL)) +	    (priv->read_reg(priv, SJA1000_SR) == REG_SR_BASICCAN_INITIAL) && +	    (priv->read_reg(priv, SJA1000_IR) == REG_IR_BASICCAN_INITIAL))  		flag = 1;  	/* Bring the SJA1000 into the PeliCAN mode*/ -	priv->write_reg(priv, REG_CDR, CDR_PELICAN); +	priv->write_reg(priv, SJA1000_CDR, CDR_PELICAN);  	/*  	 * Check registers after reset in the PeliCAN mode.  	 * See states on p. 23 of the Datasheet.  	 */ -	if (priv->read_reg(priv, REG_MOD) == REG_MOD_PELICAN_INITIAL && -	    priv->read_reg(priv, REG_SR) == REG_SR_PELICAN_INITIAL && -	    priv->read_reg(priv, REG_IR) == REG_IR_PELICAN_INITIAL) +	if (priv->read_reg(priv, SJA1000_MOD) == REG_MOD_PELICAN_INITIAL && +	    priv->read_reg(priv, SJA1000_SR) == REG_SR_PELICAN_INITIAL && +	    priv->read_reg(priv, SJA1000_IR) == REG_IR_PELICAN_INITIAL)  		return flag;  	return 0; @@ -383,7 +442,7 @@ static void plx_pci_reset_marathon(struct pci_dev *pdev)  {  	void __iomem *reset_addr;  	int i; -	int reset_bar[2] = {3, 5}; +	static const int reset_bar[2] = {3, 5};  	plx_pci_reset_common(pdev); @@ -408,7 +467,7 @@ static void plx_pci_del_card(struct pci_dev *pdev)  	struct sja1000_priv *priv;  	int i = 0; -	for (i = 0; i < card->channels; i++) { +	for (i = 0; i < PLX_PCI_MAX_CHAN; i++) {  		dev = card->net_dev[i];  		if (!dev)  			continue; @@ -438,15 +497,14 @@ static void plx_pci_del_card(struct pci_dev *pdev)  	kfree(card);  	pci_disable_device(pdev); -	pci_set_drvdata(pdev, NULL);  }  /*   * Probe PLX90xx based device for the SJA1000 chips and register each   * available CAN channel to SJA1000 Socket-CAN subsystem.   */ -static int __devinit plx_pci_add_card(struct pci_dev *pdev, -				      const struct pci_device_id *ent) +static int plx_pci_add_card(struct pci_dev *pdev, +			    const struct pci_device_id *ent)  {  	struct sja1000_priv *priv;  	struct net_device *dev; @@ -469,7 +527,6 @@ static int __devinit plx_pci_add_card(struct pci_dev *pdev,  	/* Allocate card structures to hold addresses, ... */  	card = kzalloc(sizeof(*card), GFP_KERNEL);  	if (!card) { -		dev_err(&pdev->dev, "Unable to allocate memory\n");  		pci_disable_device(pdev);  		return -ENOMEM;  	} @@ -530,13 +587,13 @@ static int __devinit plx_pci_add_card(struct pci_dev *pdev,  			priv->cdr = ci->cdr;  			SET_NETDEV_DEV(dev, &pdev->dev); +			dev->dev_id = i;  			/* Register SJA1000 device */  			err = register_sja1000dev(dev);  			if (err) {  				dev_err(&pdev->dev, "Registering device failed "  					"(err=%d)\n", err); -				free_sja1000dev(dev);  				goto failure_cleanup;  			} @@ -549,6 +606,7 @@ static int __devinit plx_pci_add_card(struct pci_dev *pdev,  			dev_err(&pdev->dev, "Channel #%d not detected\n",  				i + 1);  			free_sja1000dev(dev); +			card->net_dev[i] = NULL;  		}  	} @@ -589,15 +647,4 @@ static struct pci_driver plx_pci_driver = {  	.remove = plx_pci_del_card,  }; -static int __init plx_pci_init(void) -{ -	return pci_register_driver(&plx_pci_driver); -} - -static void __exit plx_pci_exit(void) -{ -	pci_unregister_driver(&plx_pci_driver); -} - -module_init(plx_pci_init); -module_exit(plx_pci_exit); +module_pci_driver(plx_pci_driver);  | 
