Lines Matching refs:scq

115 #define scq_virt_to_bus(scq, p) \  argument
116 (scq->dma + ((unsigned long)(p) - (unsigned long)(scq)->org))
126 static void free_scq(ns_dev *card, scq_info * scq, struct atm_vcc *vcc);
134 static int push_scqe(ns_dev * card, vc_map * vc, scq_info * scq, ns_scqe * tbd,
137 static void drain_scq(ns_dev * card, scq_info * scq, int pos);
247 free_scq(card, card->scd2vc[j]->scq, card->scd2vc[j]->tx_vcc); in nicstar_remove_one()
863 scq_info *scq; in get_scq() local
869 scq = kmalloc(sizeof(*scq), GFP_KERNEL); in get_scq()
870 if (!scq) in get_scq()
872 scq->org = dma_alloc_coherent(&card->pcidev->dev, in get_scq()
873 2 * size, &scq->dma, GFP_KERNEL); in get_scq()
874 if (!scq->org) { in get_scq()
875 kfree(scq); in get_scq()
878 scq->skb = kmalloc_array(size / NS_SCQE_SIZE, in get_scq()
879 sizeof(*scq->skb), in get_scq()
881 if (!scq->skb) { in get_scq()
883 2 * size, scq->org, scq->dma); in get_scq()
884 kfree(scq); in get_scq()
887 scq->num_entries = size / NS_SCQE_SIZE; in get_scq()
888 scq->base = PTR_ALIGN(scq->org, size); in get_scq()
889 scq->next = scq->base; in get_scq()
890 scq->last = scq->base + (scq->num_entries - 1); in get_scq()
891 scq->tail = scq->last; in get_scq()
892 scq->scd = scd; in get_scq()
893 scq->num_entries = size / NS_SCQE_SIZE; in get_scq()
894 scq->tbd_count = 0; in get_scq()
895 init_waitqueue_head(&scq->scqfull_waitq); in get_scq()
896 scq->full = 0; in get_scq()
897 spin_lock_init(&scq->lock); in get_scq()
899 for (i = 0; i < scq->num_entries; i++) in get_scq()
900 scq->skb[i] = NULL; in get_scq()
902 return scq; in get_scq()
906 static void free_scq(ns_dev *card, scq_info *scq, struct atm_vcc *vcc) in free_scq() argument
910 if (scq->num_entries == VBR_SCQ_NUM_ENTRIES) in free_scq()
911 for (i = 0; i < scq->num_entries; i++) { in free_scq()
912 if (scq->skb[i] != NULL) { in free_scq()
913 vcc = ATM_SKB(scq->skb[i])->vcc; in free_scq()
915 vcc->pop(vcc, scq->skb[i]); in free_scq()
917 dev_kfree_skb_any(scq->skb[i]); in free_scq()
924 for (i = 0; i < scq->num_entries; i++) in free_scq()
925 dev_kfree_skb_any(scq->skb[i]); in free_scq()
927 for (i = 0; i < scq->num_entries; i++) { in free_scq()
928 if (scq->skb[i] != NULL) { in free_scq()
930 vcc->pop(vcc, scq->skb[i]); in free_scq()
932 dev_kfree_skb_any(scq->skb[i]); in free_scq()
936 kfree(scq->skb); in free_scq()
938 2 * (scq->num_entries == VBR_SCQ_NUM_ENTRIES ? in free_scq()
940 scq->org, scq->dma); in free_scq()
941 kfree(scq); in free_scq()
1277 scq_info *scq; in ns_open() local
1359 scq = get_scq(card, CBR_SCQSIZE, vc->cbr_scd); in ns_open()
1360 if (scq == NULL) { in ns_open()
1369 vc->scq = scq; in ns_open()
1370 u32d[0] = scq_virt_to_bus(scq, scq->base); in ns_open()
1379 vc->scq = card->scq0; in ns_open()
1471 scq_info *scq; in ns_close() local
1473 scq = vc->scq; in ns_close()
1476 spin_lock_irqsave(&scq->lock, flags); in ns_close()
1477 scqep = scq->next; in ns_close()
1478 if (scqep == scq->base) in ns_close()
1479 scqep = scq->last; in ns_close()
1482 if (scqep == scq->tail) { in ns_close()
1483 spin_unlock_irqrestore(&scq->lock, flags); in ns_close()
1488 if (!ns_scqe_is_tsr(scqep) && scq->tail != scq->next) { in ns_close()
1496 scqi = scq->next - scq->base; in ns_close()
1500 *scq->next = tsr; in ns_close()
1502 scq->skb[index] = NULL; in ns_close()
1503 if (scq->next == scq->last) in ns_close()
1504 scq->next = scq->base; in ns_close()
1506 scq->next++; in ns_close()
1507 data = scq_virt_to_bus(scq, scq->next); in ns_close()
1508 ns_write_sram(card, scq->scd, &data, 1); in ns_close()
1510 spin_unlock_irqrestore(&scq->lock, flags); in ns_close()
1526 free_scq(card, vc->scq, vcc); in ns_close()
1532 scq_info *scq = card->scq0; in ns_close() local
1534 spin_lock_irqsave(&scq->lock, flags); in ns_close()
1536 for (i = 0; i < scq->num_entries; i++) { in ns_close()
1537 if (scq->skb[i] && ATM_SKB(scq->skb[i])->vcc == vcc) { in ns_close()
1538 ATM_SKB(scq->skb[i])->vcc = NULL; in ns_close()
1539 atm_return(vcc, scq->skb[i]->truesize); in ns_close()
1545 spin_unlock_irqrestore(&scq->lock, flags); in ns_close()
1631 scq_info *scq; in _ns_send() local
1704 scq = ((vc_map *) vcc->dev_data)->scq; in _ns_send()
1708 scq = card->scq0; in _ns_send()
1711 if (push_scqe(card, vc, scq, &scqe, skb, may_sleep) != 0) { in _ns_send()
1733 static int push_scqe(ns_dev * card, vc_map * vc, scq_info * scq, ns_scqe * tbd, in push_scqe() argument
1743 spin_lock_irqsave(&scq->lock, flags); in push_scqe()
1744 while (scq->tail == scq->next) { in push_scqe()
1746 spin_unlock_irqrestore(&scq->lock, flags); in push_scqe()
1751 scq->full = 1; in push_scqe()
1752 wait_event_interruptible_lock_irq_timeout(scq->scqfull_waitq, in push_scqe()
1753 scq->tail != scq->next, in push_scqe()
1754 scq->lock, in push_scqe()
1757 if (scq->full) { in push_scqe()
1758 spin_unlock_irqrestore(&scq->lock, flags); in push_scqe()
1764 *scq->next = *tbd; in push_scqe()
1765 index = (int)(scq->next - scq->base); in push_scqe()
1766 scq->skb[index] = skb; in push_scqe()
1772 scq->next); in push_scqe()
1773 if (scq->next == scq->last) in push_scqe()
1774 scq->next = scq->base; in push_scqe()
1776 scq->next++; in push_scqe()
1779 if (scq->num_entries == VBR_SCQ_NUM_ENTRIES) { in push_scqe()
1780 scq->tbd_count++; in push_scqe()
1786 || scq->tbd_count >= MAX_TBD_PER_SCQ) { in push_scqe()
1789 while (scq->tail == scq->next) { in push_scqe()
1791 data = scq_virt_to_bus(scq, scq->next); in push_scqe()
1792 ns_write_sram(card, scq->scd, &data, 1); in push_scqe()
1793 spin_unlock_irqrestore(&scq->lock, flags); in push_scqe()
1799 scq->full = 1; in push_scqe()
1802 wait_event_interruptible_lock_irq_timeout(scq->scqfull_waitq, in push_scqe()
1803 scq->tail != scq->next, in push_scqe()
1804 scq->lock, in push_scqe()
1808 if (!scq->full) { in push_scqe()
1814 scqi = scq->next - scq->base; in push_scqe()
1819 *scq->next = tsr; in push_scqe()
1821 scq->skb[index] = NULL; in push_scqe()
1826 le32_to_cpu(tsr.word_4), scq->next); in push_scqe()
1827 if (scq->next == scq->last) in push_scqe()
1828 scq->next = scq->base; in push_scqe()
1830 scq->next++; in push_scqe()
1832 scq->tbd_count = 0; in push_scqe()
1837 data = scq_virt_to_bus(scq, scq->next); in push_scqe()
1838 ns_write_sram(card, scq->scd, &data, 1); in push_scqe()
1840 spin_unlock_irqrestore(&scq->lock, flags); in push_scqe()
1848 scq_info *scq; in process_tsq() local
1881 scq = card->scq0; in process_tsq()
1890 scq = card->scd2vc[scdi]->scq; in process_tsq()
1892 drain_scq(card, scq, ns_tsi_getscqpos(card->tsq.next)); in process_tsq()
1893 scq->full = 0; in process_tsq()
1894 wake_up_interruptible(&(scq->scqfull_waitq)); in process_tsq()
1920 static void drain_scq(ns_dev * card, scq_info * scq, int pos) in drain_scq() argument
1928 card->index, scq, pos); in drain_scq()
1929 if (pos >= scq->num_entries) { in drain_scq()
1934 spin_lock_irqsave(&scq->lock, flags); in drain_scq()
1935 i = (int)(scq->tail - scq->base); in drain_scq()
1936 if (++i == scq->num_entries) in drain_scq()
1939 skb = scq->skb[i]; in drain_scq()
1953 scq->skb[i] = NULL; in drain_scq()
1955 if (++i == scq->num_entries) in drain_scq()
1958 scq->tail = scq->base + pos; in drain_scq()
1959 spin_unlock_irqrestore(&scq->lock, flags); in drain_scq()