Lines Matching full:card

30 static inline void softing_set_reset_dpram(struct softing *card)  in softing_set_reset_dpram()  argument
32 if (card->pdat->generation >= 2) { in softing_set_reset_dpram()
33 spin_lock_bh(&card->spin); in softing_set_reset_dpram()
34 iowrite8(ioread8(&card->dpram[DPRAM_V2_RESET]) & ~1, in softing_set_reset_dpram()
35 &card->dpram[DPRAM_V2_RESET]); in softing_set_reset_dpram()
36 spin_unlock_bh(&card->spin); in softing_set_reset_dpram()
40 static inline void softing_clr_reset_dpram(struct softing *card) in softing_clr_reset_dpram() argument
42 if (card->pdat->generation >= 2) { in softing_clr_reset_dpram()
43 spin_lock_bh(&card->spin); in softing_clr_reset_dpram()
44 iowrite8(ioread8(&card->dpram[DPRAM_V2_RESET]) | 1, in softing_clr_reset_dpram()
45 &card->dpram[DPRAM_V2_RESET]); in softing_clr_reset_dpram()
46 spin_unlock_bh(&card->spin); in softing_clr_reset_dpram()
55 struct softing *card = priv->card; in softing_netdev_start_xmit() local
65 spin_lock(&card->spin); in softing_netdev_start_xmit()
68 if (!card->fw.up || in softing_netdev_start_xmit()
69 (card->tx.pending >= TXMAX) || in softing_netdev_start_xmit()
72 fifo_wr = ioread8(&card->dpram[DPRAM_TX_WR]); in softing_netdev_start_xmit()
73 fifo_rd = ioread8(&card->dpram[DPRAM_TX_RD]); in softing_netdev_start_xmit()
99 memcpy_toio(&card->dpram[DPRAM_TX + DPRAM_TX_SIZE * fifo_wr], in softing_netdev_start_xmit()
103 iowrite8(fifo_wr, &card->dpram[DPRAM_TX_WR]); in softing_netdev_start_xmit()
104 card->tx.last_bus = priv->index; in softing_netdev_start_xmit()
105 ++card->tx.pending; in softing_netdev_start_xmit()
114 spin_unlock(&card->spin); in softing_netdev_start_xmit()
115 if (card->tx.pending >= TXMAX) { in softing_netdev_start_xmit()
117 for (j = 0; j < ARRAY_SIZE(card->net); ++j) { in softing_netdev_start_xmit()
118 if (card->net[j]) in softing_netdev_start_xmit()
119 netif_stop_queue(card->net[j]); in softing_netdev_start_xmit()
149 static int softing_handle_1(struct softing *card) in softing_handle_1() argument
163 lost_msg = ioread8(&card->dpram[DPRAM_RX_LOST]); in softing_handle_1()
167 iowrite8(0, &card->dpram[DPRAM_RX_LOST]); in softing_handle_1()
176 for (j = 0; j < ARRAY_SIZE(card->net); ++j) { in softing_handle_1()
177 netdev = card->net[j]; in softing_handle_1()
191 fifo_rd = ioread8(&card->dpram[DPRAM_RX_RD]); in softing_handle_1()
192 fifo_wr = ioread8(&card->dpram[DPRAM_RX_WR]); in softing_handle_1()
199 memcpy_fromio(buf, &card->dpram[DPRAM_RX + DPRAM_RX_SIZE*fifo_rd], in softing_handle_1()
203 iowrite8(fifo_rd, &card->dpram[DPRAM_RX_RD]); in softing_handle_1()
208 /* not quite useful, probably the card has got out */ in softing_handle_1()
210 netdev = card->net[0]; in softing_handle_1()
212 netdev = card->net[1]; in softing_handle_1()
238 iowrite8(state, &card->dpram[priv->index ? in softing_handle_1()
242 ktime = softing_raw2ktime(card, tmp_u32); in softing_handle_1()
275 ktime = softing_raw2ktime(card, tmp_u32); in softing_handle_1()
291 if (card->tx.pending) in softing_handle_1()
292 --card->tx.pending; in softing_handle_1()
318 struct softing *card = (struct softing *)dev_id; in softing_irq_thread() local
324 spin_lock_bh(&card->spin); in softing_irq_thread()
325 while (softing_handle_1(card) > 0) { in softing_irq_thread()
326 ++card->irq.svc_count; in softing_irq_thread()
329 spin_unlock_bh(&card->spin); in softing_irq_thread()
331 offset = card->tx.last_bus; in softing_irq_thread()
332 for (j = 0; j < ARRAY_SIZE(card->net); ++j) { in softing_irq_thread()
333 if (card->tx.pending >= TXMAX) in softing_irq_thread()
335 netdev = card->net[(j + offset + 1) % card->pdat->nbus]; in softing_irq_thread()
356 struct softing *card = (struct softing *)dev_id; in softing_irq_v2() local
359 ir = ioread8(&card->dpram[DPRAM_V2_IRQ_TOHOST]); in softing_irq_v2()
360 iowrite8(0, &card->dpram[DPRAM_V2_IRQ_TOHOST]); in softing_irq_v2()
366 struct softing *card = (struct softing *)dev_id; in softing_irq_v1() local
369 ir = ioread8(&card->dpram[DPRAM_IRQ_TOHOST]); in softing_irq_v1()
370 iowrite8(0, &card->dpram[DPRAM_IRQ_TOHOST]); in softing_irq_v1()
423 int softing_enable_irq(struct softing *card, int enable) in softing_enable_irq() argument
427 if (!card->irq.nr) { in softing_enable_irq()
429 } else if (card->irq.requested && !enable) { in softing_enable_irq()
430 free_irq(card->irq.nr, card); in softing_enable_irq()
431 card->irq.requested = 0; in softing_enable_irq()
432 } else if (!card->irq.requested && enable) { in softing_enable_irq()
433 ret = request_threaded_irq(card->irq.nr, in softing_enable_irq()
434 (card->pdat->generation >= 2) ? in softing_enable_irq()
437 dev_name(&card->pdev->dev), card); in softing_enable_irq()
439 dev_alert(&card->pdev->dev, in softing_enable_irq()
441 card->irq.nr); in softing_enable_irq()
444 card->irq.requested = 1; in softing_enable_irq()
449 static void softing_card_shutdown(struct softing *card) in softing_card_shutdown() argument
453 if (mutex_lock_interruptible(&card->fw.lock)) { in softing_card_shutdown()
456 fw_up = card->fw.up; in softing_card_shutdown()
457 card->fw.up = 0; in softing_card_shutdown()
459 if (card->irq.requested && card->irq.nr) { in softing_card_shutdown()
460 free_irq(card->irq.nr, card); in softing_card_shutdown()
461 card->irq.requested = 0; in softing_card_shutdown()
464 if (card->pdat->enable_irq) in softing_card_shutdown()
465 card->pdat->enable_irq(card->pdev, 0); in softing_card_shutdown()
466 softing_set_reset_dpram(card); in softing_card_shutdown()
467 if (card->pdat->reset) in softing_card_shutdown()
468 card->pdat->reset(card->pdev, 1); in softing_card_shutdown()
470 mutex_unlock(&card->fw.lock); in softing_card_shutdown()
473 static int softing_card_boot(struct softing *card) in softing_card_boot() argument
480 if (mutex_lock_interruptible(&card->fw.lock)) in softing_card_boot()
482 if (card->fw.up) { in softing_card_boot()
483 mutex_unlock(&card->fw.lock); in softing_card_boot()
487 if (card->pdat->enable_irq) in softing_card_boot()
488 card->pdat->enable_irq(card->pdev, 1); in softing_card_boot()
489 /* boot card */ in softing_card_boot()
490 softing_set_reset_dpram(card); in softing_card_boot()
491 if (card->pdat->reset) in softing_card_boot()
492 card->pdat->reset(card->pdev, 1); in softing_card_boot()
493 for (j = 0; (j + sizeof(stream)) < card->dpram_size; in softing_card_boot()
496 memcpy_toio(&card->dpram[j], stream, sizeof(stream)); in softing_card_boot()
499 memcpy_fromio(back, &card->dpram[j], sizeof(stream)); in softing_card_boot()
504 dev_alert(&card->pdev->dev, "dpram failed at 0x%04x\n", j); in softing_card_boot()
510 ret = softing_load_fw(card->pdat->boot.fw, card, card->dpram, in softing_card_boot()
511 card->dpram_size, in softing_card_boot()
512 card->pdat->boot.offs - card->pdat->boot.addr); in softing_card_boot()
516 ret = softing_load_fw(card->pdat->load.fw, card, card->dpram, in softing_card_boot()
517 card->dpram_size, in softing_card_boot()
518 card->pdat->load.offs - card->pdat->load.addr); in softing_card_boot()
522 if (card->pdat->reset) in softing_card_boot()
523 card->pdat->reset(card->pdev, 0); in softing_card_boot()
524 softing_clr_reset_dpram(card); in softing_card_boot()
525 ret = softing_bootloader_command(card, 0, "card boot"); in softing_card_boot()
528 ret = softing_load_app_fw(card->pdat->app.fw, card); in softing_card_boot()
532 ret = softing_chip_poweron(card); in softing_card_boot()
536 card->fw.up = 1; in softing_card_boot()
537 mutex_unlock(&card->fw.lock); in softing_card_boot()
540 card->fw.up = 0; in softing_card_boot()
541 if (card->pdat->enable_irq) in softing_card_boot()
542 card->pdat->enable_irq(card->pdev, 0); in softing_card_boot()
543 softing_set_reset_dpram(card); in softing_card_boot()
544 if (card->pdat->reset) in softing_card_boot()
545 card->pdat->reset(card->pdev, 1); in softing_card_boot()
546 mutex_unlock(&card->fw.lock); in softing_card_boot()
576 struct softing *card = priv->card; in store_output() local
585 ret = mutex_lock_interruptible(&card->fw.lock); in store_output()
589 mutex_unlock(&card->fw.lock); in store_output()
593 mutex_unlock(&card->fw.lock); in store_output()
630 static struct net_device *softing_netdev_create(struct softing *card, in softing_netdev_create() argument
638 dev_alert(&card->pdev->dev, "alloc_candev failed\n"); in softing_netdev_create()
643 priv->card = card; in softing_netdev_create()
645 priv->btr_const.brp_max = card->pdat->max_brp; in softing_netdev_create()
646 priv->btr_const.sjw_max = card->pdat->max_sjw; in softing_netdev_create()
651 SET_NETDEV_DEV(netdev, &card->pdev->dev); in softing_netdev_create()
690 struct softing *card = dev_get_drvdata(dev); \
691 return sprintf(buf, "%u\n", card->member); \
699 struct softing *card = dev_get_drvdata(dev); \
700 return sprintf(buf, "%s\n", card->member); \
731 struct softing *card = platform_get_drvdata(pdev); in softing_pdev_remove() local
734 /* first, disable card*/ in softing_pdev_remove()
735 softing_card_shutdown(card); in softing_pdev_remove()
737 for (j = 0; j < ARRAY_SIZE(card->net); ++j) { in softing_pdev_remove()
738 if (!card->net[j]) in softing_pdev_remove()
740 softing_netdev_cleanup(card->net[j]); in softing_pdev_remove()
741 card->net[j] = NULL; in softing_pdev_remove()
745 iounmap(card->dpram); in softing_pdev_remove()
746 kfree(card); in softing_pdev_remove()
753 struct softing *card; in softing_pdev_probe() local
764 if (pdat->nbus > ARRAY_SIZE(card->net)) { in softing_pdev_probe()
769 card = kzalloc(sizeof(*card), GFP_KERNEL); in softing_pdev_probe()
770 if (!card) in softing_pdev_probe()
772 card->pdat = pdat; in softing_pdev_probe()
773 card->pdev = pdev; in softing_pdev_probe()
774 platform_set_drvdata(pdev, card); in softing_pdev_probe()
775 mutex_init(&card->fw.lock); in softing_pdev_probe()
776 spin_lock_init(&card->spin); in softing_pdev_probe()
782 card->dpram_phys = pres->start; in softing_pdev_probe()
783 card->dpram_size = resource_size(pres); in softing_pdev_probe()
784 card->dpram = ioremap(card->dpram_phys, card->dpram_size); in softing_pdev_probe()
785 if (!card->dpram) { in softing_pdev_probe()
786 dev_alert(&card->pdev->dev, "dpram ioremap failed\n"); in softing_pdev_probe()
792 card->irq.nr = pres->start; in softing_pdev_probe()
794 /* reset card */ in softing_pdev_probe()
795 ret = softing_card_boot(card); in softing_pdev_probe()
802 card->id.freq = card->pdat->freq; in softing_pdev_probe()
806 dev_alert(&card->pdev->dev, "sysfs failed\n"); in softing_pdev_probe()
810 for (j = 0; j < ARRAY_SIZE(card->net); ++j) { in softing_pdev_probe()
811 card->net[j] = netdev = in softing_pdev_probe()
812 softing_netdev_create(card, card->id.chip[j]); in softing_pdev_probe()
819 priv = netdev_priv(card->net[j]); in softing_pdev_probe()
824 card->net[j] = NULL; in softing_pdev_probe()
825 dev_alert(&card->pdev->dev, in softing_pdev_probe()
830 dev_info(&card->pdev->dev, "%s ready.\n", card->pdat->name); in softing_pdev_probe()
834 for (j = 0; j < ARRAY_SIZE(card->net); ++j) { in softing_pdev_probe()
835 if (!card->net[j]) in softing_pdev_probe()
837 softing_netdev_cleanup(card->net[j]); in softing_pdev_probe()
841 softing_card_shutdown(card); in softing_pdev_probe()
843 iounmap(card->dpram); in softing_pdev_probe()
846 kfree(card); in softing_pdev_probe()