Lines Matching defs:card

154 static void pcan_set_leds(struct pcan_pccard *card, u8 mask, u8 state);
159 static void pcan_start_led_timer(struct pcan_pccard *card)
161 if (!timer_pending(&card->led_timer))
162 mod_timer(&card->led_timer, jiffies + HZ);
168 static void pcan_stop_led_timer(struct pcan_pccard *card)
170 del_timer_sync(&card->led_timer);
186 struct pcan_pccard *card = priv->priv;
187 int c = (priv->reg_base - card->ioport_addr) / PCC_CHAN_SIZE;
194 pcan_set_leds(card, PCC_LED(c), PCC_LED_ON);
198 pcan_set_leds(card, PCC_LED(c), PCC_LED_SLOW);
199 pcan_start_led_timer(card);
211 static u8 pcan_read_reg(struct pcan_pccard *card, int port)
213 return ioread8(card->ioport_addr + PCC_COMN_OFF + port);
219 static void pcan_write_reg(struct pcan_pccard *card, int port, u8 v)
223 if (card->ccr == v)
225 card->ccr = v;
228 iowrite8(v, card->ioport_addr + PCC_COMN_OFF + port);
232 * check whether the card is present by checking its fw version numbers
235 static inline int pcan_pccard_present(struct pcan_pccard *card)
237 return ((pcan_read_reg(card, PCC_FW_MAJOR) == card->fw_major) &&
238 (pcan_read_reg(card, PCC_FW_MINOR) == card->fw_minor));
244 static int pcan_wait_spi_busy(struct pcan_pccard *card)
250 while (pcan_read_reg(card, PCC_CSR) & PCC_CSR_SPI_BUSY) {
262 static int pcan_write_eeprom(struct pcan_pccard *card, u16 addr, u8 v)
268 pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_WREN);
269 err = pcan_wait_spi_busy(card);
276 pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_RDSR);
277 err = pcan_wait_spi_busy(card);
282 status = pcan_read_reg(card, PCC_SPI_DIR);
288 dev_err(&card->pdev->dev,
294 pcan_write_reg(card, PCC_SPI_ADR, addr & 0xff);
295 pcan_write_reg(card, PCC_SPI_DOR, v);
301 pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_WRITE(addr));
302 err = pcan_wait_spi_busy(card);
309 pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_RDSR);
310 err = pcan_wait_spi_busy(card);
315 status = pcan_read_reg(card, PCC_SPI_DIR);
321 dev_err(&card->pdev->dev,
327 pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_WRDI);
328 err = pcan_wait_spi_busy(card);
335 dev_err(&card->pdev->dev,
341 static void pcan_set_leds(struct pcan_pccard *card, u8 led_mask, u8 state)
343 u8 ccr = card->ccr;
346 for (i = 0; i < card->chan_count; i++)
355 pcan_write_reg(card, PCC_CCR, ccr);
361 static inline void pcan_set_can_power(struct pcan_pccard *card, int onoff)
365 err = pcan_write_eeprom(card, 0, !!onoff);
367 dev_err(&card->pdev->dev,
377 struct pcan_pccard *card = from_timer(card, t, led_timer);
382 ccr = card->ccr;
383 for (i = 0; i < card->chan_count; i++) {
388 netdev = card->channel[i].netdev;
399 if (netdev->stats.rx_bytes != card->channel[i].prev_rx_bytes) {
400 card->channel[i].prev_rx_bytes = netdev->stats.rx_bytes;
404 if (netdev->stats.tx_bytes != card->channel[i].prev_tx_bytes) {
405 card->channel[i].prev_tx_bytes = netdev->stats.tx_bytes;
412 pcan_write_reg(card, PCC_CCR, ccr);
416 mod_timer(&card->led_timer, jiffies + HZ);
424 struct pcan_pccard *card = dev_id;
434 for (i = 0; i < card->chan_count; i++) {
438 * check whether the card is present before calling
441 if (!pcan_pccard_present(card)) {
442 /* card unplugged during isr */
450 netdev = card->channel[i].netdev;
466 static void pcan_free_channels(struct pcan_pccard *card)
471 for (i = 0; i < card->chan_count; i++) {
477 netdev = card->channel[i].netdev;
487 dev_info(&card->pdev->dev, "%s removed\n", name);
491 if (pcan_pccard_present(card)) {
492 pcan_set_leds(card, led_mask, PCC_LED_OFF);
493 pcan_set_can_power(card, 0);
513 static int pcan_add_channels(struct pcan_pccard *card)
515 struct pcmcia_device *pdev = card->pdev;
520 card->ccr = ~ccr;
521 pcan_write_reg(card, PCC_CCR, ccr);
527 pcan_write_reg(card, PCC_CCR, ccr);
530 for (i = 0; i < ARRAY_SIZE(card->channel); i++) {
542 priv->priv = card;
548 priv->reg_base = card->ioport_addr + PCC_CHAN_OFF(i);
576 card->channel[i].netdev = netdev;
577 card->chan_count++;
588 pcan_write_reg(card, PCC_CCR, ccr);
608 struct pcan_pccard *card = pdev->priv;
610 if (!card)
613 free_irq(pdev->irq, card);
614 pcan_stop_led_timer(card);
616 pcan_free_channels(card);
618 ioport_unmap(card->ioport_addr);
620 kfree(card);
629 struct pcan_pccard *card;
653 card = kzalloc(sizeof(struct pcan_pccard), GFP_KERNEL);
654 if (!card) {
659 card->pdev = pdev;
660 pdev->priv = card;
663 card->ioport_addr = ioport_map(pdev->resource[0]->start,
665 if (!card->ioport_addr) {
670 card->fw_major = pcan_read_reg(card, PCC_FW_MAJOR);
671 card->fw_minor = pcan_read_reg(card, PCC_FW_MINOR);
674 dev_info(&pdev->dev, "PEAK-System pcmcia card %s fw %d.%d\n",
676 card->fw_major, card->fw_minor);
679 pcan_add_channels(card);
680 if (!card->chan_count) {
686 timer_setup(&card->led_timer, pcan_led_timer, 0);
689 err = request_irq(pdev->irq, &pcan_isr, IRQF_SHARED, PCC_NAME, card);
696 pcan_set_can_power(card, 1);
702 pcan_free_channels(card);
705 ioport_unmap(card->ioport_addr);
708 kfree(card);