Lines Matching refs:card

163 static void pcan_set_leds(struct pcan_pccard *card, u8 mask, u8 state);
168 static void pcan_start_led_timer(struct pcan_pccard *card) in pcan_start_led_timer() argument
170 if (!timer_pending(&card->led_timer)) in pcan_start_led_timer()
171 mod_timer(&card->led_timer, jiffies + HZ); in pcan_start_led_timer()
177 static void pcan_stop_led_timer(struct pcan_pccard *card) in pcan_stop_led_timer() argument
179 del_timer_sync(&card->led_timer); in pcan_stop_led_timer()
195 struct pcan_pccard *card = priv->priv; in pcan_write_canreg() local
196 int c = (priv->reg_base - card->ioport_addr) / PCC_CHAN_SIZE; in pcan_write_canreg()
203 pcan_set_leds(card, PCC_LED(c), PCC_LED_ON); in pcan_write_canreg()
207 pcan_set_leds(card, PCC_LED(c), PCC_LED_SLOW); in pcan_write_canreg()
208 pcan_start_led_timer(card); in pcan_write_canreg()
220 static u8 pcan_read_reg(struct pcan_pccard *card, int port) in pcan_read_reg() argument
222 return ioread8(card->ioport_addr + PCC_COMN_OFF + port); in pcan_read_reg()
228 static void pcan_write_reg(struct pcan_pccard *card, int port, u8 v) in pcan_write_reg() argument
232 if (card->ccr == v) in pcan_write_reg()
234 card->ccr = v; in pcan_write_reg()
237 iowrite8(v, card->ioport_addr + PCC_COMN_OFF + port); in pcan_write_reg()
244 static inline int pcan_pccard_present(struct pcan_pccard *card) in pcan_pccard_present() argument
246 return ((pcan_read_reg(card, PCC_FW_MAJOR) == card->fw_major) && in pcan_pccard_present()
247 (pcan_read_reg(card, PCC_FW_MINOR) == card->fw_minor)); in pcan_pccard_present()
253 static int pcan_wait_spi_busy(struct pcan_pccard *card) in pcan_wait_spi_busy() argument
259 while (pcan_read_reg(card, PCC_CSR) & PCC_CSR_SPI_BUSY) { in pcan_wait_spi_busy()
271 static int pcan_write_eeprom(struct pcan_pccard *card, u16 addr, u8 v) in pcan_write_eeprom() argument
277 pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_WREN); in pcan_write_eeprom()
278 err = pcan_wait_spi_busy(card); in pcan_write_eeprom()
285 pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_RDSR); in pcan_write_eeprom()
286 err = pcan_wait_spi_busy(card); in pcan_write_eeprom()
291 status = pcan_read_reg(card, PCC_SPI_DIR); in pcan_write_eeprom()
297 dev_err(&card->pdev->dev, in pcan_write_eeprom()
303 pcan_write_reg(card, PCC_SPI_ADR, addr & 0xff); in pcan_write_eeprom()
304 pcan_write_reg(card, PCC_SPI_DOR, v); in pcan_write_eeprom()
310 pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_WRITE(addr)); in pcan_write_eeprom()
311 err = pcan_wait_spi_busy(card); in pcan_write_eeprom()
318 pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_RDSR); in pcan_write_eeprom()
319 err = pcan_wait_spi_busy(card); in pcan_write_eeprom()
324 status = pcan_read_reg(card, PCC_SPI_DIR); in pcan_write_eeprom()
330 dev_err(&card->pdev->dev, in pcan_write_eeprom()
336 pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_WRDI); in pcan_write_eeprom()
337 err = pcan_wait_spi_busy(card); in pcan_write_eeprom()
344 dev_err(&card->pdev->dev, in pcan_write_eeprom()
350 static void pcan_set_leds(struct pcan_pccard *card, u8 led_mask, u8 state) in pcan_set_leds() argument
352 u8 ccr = card->ccr; in pcan_set_leds()
355 for (i = 0; i < card->chan_count; i++) in pcan_set_leds()
364 pcan_write_reg(card, PCC_CCR, ccr); in pcan_set_leds()
370 static inline void pcan_set_can_power(struct pcan_pccard *card, int onoff) in pcan_set_can_power() argument
374 err = pcan_write_eeprom(card, 0, !!onoff); in pcan_set_can_power()
376 dev_err(&card->pdev->dev, in pcan_set_can_power()
386 struct pcan_pccard *card = (struct pcan_pccard *)arg; in pcan_led_timer() local
391 ccr = card->ccr; in pcan_led_timer()
392 for (i = 0; i < card->chan_count; i++) { in pcan_led_timer()
397 netdev = card->channel[i].netdev; in pcan_led_timer()
408 if (netdev->stats.rx_bytes != card->channel[i].prev_rx_bytes) { in pcan_led_timer()
409 card->channel[i].prev_rx_bytes = netdev->stats.rx_bytes; in pcan_led_timer()
413 if (netdev->stats.tx_bytes != card->channel[i].prev_tx_bytes) { in pcan_led_timer()
414 card->channel[i].prev_tx_bytes = netdev->stats.tx_bytes; in pcan_led_timer()
421 pcan_write_reg(card, PCC_CCR, ccr); in pcan_led_timer()
425 mod_timer(&card->led_timer, jiffies + HZ); in pcan_led_timer()
433 struct pcan_pccard *card = dev_id; in pcan_isr() local
443 for (i = 0; i < card->chan_count; i++) { in pcan_isr()
450 if (!pcan_pccard_present(card)) { in pcan_isr()
459 netdev = card->channel[i].netdev; in pcan_isr()
475 static void pcan_free_channels(struct pcan_pccard *card) in pcan_free_channels() argument
480 for (i = 0; i < card->chan_count; i++) { in pcan_free_channels()
486 netdev = card->channel[i].netdev; in pcan_free_channels()
496 dev_info(&card->pdev->dev, "%s removed\n", name); in pcan_free_channels()
500 if (pcan_pccard_present(card)) { in pcan_free_channels()
501 pcan_set_leds(card, led_mask, PCC_LED_OFF); in pcan_free_channels()
502 pcan_set_can_power(card, 0); in pcan_free_channels()
522 static int pcan_add_channels(struct pcan_pccard *card) in pcan_add_channels() argument
524 struct pcmcia_device *pdev = card->pdev; in pcan_add_channels()
529 card->ccr = ~ccr; in pcan_add_channels()
530 pcan_write_reg(card, PCC_CCR, ccr); in pcan_add_channels()
536 pcan_write_reg(card, PCC_CCR, ccr); in pcan_add_channels()
539 for (i = 0; i < ARRAY_SIZE(card->channel); i++) { in pcan_add_channels()
551 priv->priv = card; in pcan_add_channels()
557 priv->reg_base = card->ioport_addr + PCC_CHAN_OFF(i); in pcan_add_channels()
585 card->channel[i].netdev = netdev; in pcan_add_channels()
586 card->chan_count++; in pcan_add_channels()
597 pcan_write_reg(card, PCC_CCR, ccr); in pcan_add_channels()
617 struct pcan_pccard *card = pdev->priv; in pcan_free() local
619 if (!card) in pcan_free()
622 free_irq(pdev->irq, card); in pcan_free()
623 pcan_stop_led_timer(card); in pcan_free()
625 pcan_free_channels(card); in pcan_free()
627 ioport_unmap(card->ioport_addr); in pcan_free()
629 kfree(card); in pcan_free()
638 struct pcan_pccard *card; in pcan_probe() local
662 card = kzalloc(sizeof(struct pcan_pccard), GFP_KERNEL); in pcan_probe()
663 if (!card) { in pcan_probe()
668 card->pdev = pdev; in pcan_probe()
669 pdev->priv = card; in pcan_probe()
672 card->ioport_addr = ioport_map(pdev->resource[0]->start, in pcan_probe()
674 if (!card->ioport_addr) { in pcan_probe()
679 card->fw_major = pcan_read_reg(card, PCC_FW_MAJOR); in pcan_probe()
680 card->fw_minor = pcan_read_reg(card, PCC_FW_MINOR); in pcan_probe()
685 card->fw_major, card->fw_minor); in pcan_probe()
688 pcan_add_channels(card); in pcan_probe()
689 if (!card->chan_count) { in pcan_probe()
695 init_timer(&card->led_timer); in pcan_probe()
696 card->led_timer.function = pcan_led_timer; in pcan_probe()
697 card->led_timer.data = (unsigned long)card; in pcan_probe()
700 err = request_irq(pdev->irq, &pcan_isr, IRQF_SHARED, PCC_NAME, card); in pcan_probe()
707 pcan_set_can_power(card, 1); in pcan_probe()
713 pcan_free_channels(card); in pcan_probe()
716 ioport_unmap(card->ioport_addr); in pcan_probe()
719 kfree(card); in pcan_probe()