Lines Matching refs:scq
27 * 2 - Per SCQ scq spinlock
115 #define scq_virt_to_bus(scq, p) \
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);
133 static int push_scqe(ns_dev * card, vc_map * vc, scq_info * scq, ns_scqe * tbd,
136 static void drain_scq(ns_dev * card, scq_info * scq, int pos);
245 free_scq(card, card->scd2vc[j]->scq, card->scd2vc[j]->tx_vcc);
861 scq_info *scq;
867 scq = kmalloc(sizeof(*scq), GFP_KERNEL);
868 if (!scq)
870 scq->org = dma_alloc_coherent(&card->pcidev->dev,
871 2 * size, &scq->dma, GFP_KERNEL);
872 if (!scq->org) {
873 kfree(scq);
876 scq->skb = kmalloc_array(size / NS_SCQE_SIZE,
877 sizeof(*scq->skb),
879 if (!scq->skb) {
881 2 * size, scq->org, scq->dma);
882 kfree(scq);
885 scq->num_entries = size / NS_SCQE_SIZE;
886 scq->base = PTR_ALIGN(scq->org, size);
887 scq->next = scq->base;
888 scq->last = scq->base + (scq->num_entries - 1);
889 scq->tail = scq->last;
890 scq->scd = scd;
891 scq->num_entries = size / NS_SCQE_SIZE;
892 scq->tbd_count = 0;
893 init_waitqueue_head(&scq->scqfull_waitq);
894 scq->full = 0;
895 spin_lock_init(&scq->lock);
897 for (i = 0; i < scq->num_entries; i++)
898 scq->skb[i] = NULL;
900 return scq;
904 static void free_scq(ns_dev *card, scq_info *scq, struct atm_vcc *vcc)
908 if (scq->num_entries == VBR_SCQ_NUM_ENTRIES)
909 for (i = 0; i < scq->num_entries; i++) {
910 if (scq->skb[i] != NULL) {
911 vcc = ATM_SKB(scq->skb[i])->vcc;
913 vcc->pop(vcc, scq->skb[i]);
915 dev_kfree_skb_any(scq->skb[i]);
921 ("nicstar: free_scq() called with vcc == NULL for fixed rate scq.");
922 for (i = 0; i < scq->num_entries; i++)
923 dev_kfree_skb_any(scq->skb[i]);
925 for (i = 0; i < scq->num_entries; i++) {
926 if (scq->skb[i] != NULL) {
928 vcc->pop(vcc, scq->skb[i]);
930 dev_kfree_skb_any(scq->skb[i]);
934 kfree(scq->skb);
936 2 * (scq->num_entries == VBR_SCQ_NUM_ENTRIES ?
938 scq->org, scq->dma);
939 kfree(scq);
1275 scq_info *scq;
1357 scq = get_scq(card, CBR_SCQSIZE, vc->cbr_scd);
1358 if (scq == NULL) {
1367 vc->scq = scq;
1368 u32d[0] = scq_virt_to_bus(scq, scq->base);
1377 vc->scq = card->scq0;
1469 scq_info *scq;
1471 scq = vc->scq;
1474 spin_lock_irqsave(&scq->lock, flags);
1475 scqep = scq->next;
1476 if (scqep == scq->base)
1477 scqep = scq->last;
1480 if (scqep == scq->tail) {
1481 spin_unlock_irqrestore(&scq->lock, flags);
1486 if (!ns_scqe_is_tsr(scqep) && scq->tail != scq->next) {
1494 scqi = scq->next - scq->base;
1498 *scq->next = tsr;
1500 scq->skb[index] = NULL;
1501 if (scq->next == scq->last)
1502 scq->next = scq->base;
1504 scq->next++;
1505 data = scq_virt_to_bus(scq, scq->next);
1506 ns_write_sram(card, scq->scd, &data, 1);
1508 spin_unlock_irqrestore(&scq->lock, flags);
1524 free_scq(card, vc->scq, vcc);
1530 scq_info *scq = card->scq0;
1532 spin_lock_irqsave(&scq->lock, flags);
1534 for (i = 0; i < scq->num_entries; i++) {
1535 if (scq->skb[i] && ATM_SKB(scq->skb[i])->vcc == vcc) {
1536 ATM_SKB(scq->skb[i])->vcc = NULL;
1537 atm_return(vcc, scq->skb[i]->truesize);
1543 spin_unlock_irqrestore(&scq->lock, flags);
1629 scq_info *scq;
1702 scq = ((vc_map *) vcc->dev_data)->scq;
1706 scq = card->scq0;
1709 if (push_scqe(card, vc, scq, &scqe, skb) != 0) {
1721 static int push_scqe(ns_dev * card, vc_map * vc, scq_info * scq, ns_scqe * tbd,
1731 spin_lock_irqsave(&scq->lock, flags);
1732 while (scq->tail == scq->next) {
1734 spin_unlock_irqrestore(&scq->lock, flags);
1739 scq->full = 1;
1740 wait_event_interruptible_lock_irq_timeout(scq->scqfull_waitq,
1741 scq->tail != scq->next,
1742 scq->lock,
1745 if (scq->full) {
1746 spin_unlock_irqrestore(&scq->lock, flags);
1752 *scq->next = *tbd;
1753 index = (int)(scq->next - scq->base);
1754 scq->skb[index] = skb;
1760 scq->next);
1761 if (scq->next == scq->last)
1762 scq->next = scq->base;
1764 scq->next++;
1767 if (scq->num_entries == VBR_SCQ_NUM_ENTRIES) {
1768 scq->tbd_count++;
1774 || scq->tbd_count >= MAX_TBD_PER_SCQ) {
1777 while (scq->tail == scq->next) {
1779 data = scq_virt_to_bus(scq, scq->next);
1780 ns_write_sram(card, scq->scd, &data, 1);
1781 spin_unlock_irqrestore(&scq->lock, flags);
1787 scq->full = 1;
1790 wait_event_interruptible_lock_irq_timeout(scq->scqfull_waitq,
1791 scq->tail != scq->next,
1792 scq->lock,
1796 if (!scq->full) {
1802 scqi = scq->next - scq->base;
1807 *scq->next = tsr;
1809 scq->skb[index] = NULL;
1814 le32_to_cpu(tsr.word_4), scq->next);
1815 if (scq->next == scq->last)
1816 scq->next = scq->base;
1818 scq->next++;
1820 scq->tbd_count = 0;
1825 data = scq_virt_to_bus(scq, scq->next);
1826 ns_write_sram(card, scq->scd, &data, 1);
1828 spin_unlock_irqrestore(&scq->lock, flags);
1836 scq_info *scq;
1869 scq = card->scq0;
1878 scq = card->scd2vc[scdi]->scq;
1880 drain_scq(card, scq, ns_tsi_getscqpos(card->tsq.next));
1881 scq->full = 0;
1882 wake_up_interruptible(&(scq->scqfull_waitq));
1908 static void drain_scq(ns_dev * card, scq_info * scq, int pos)
1915 XPRINTK("nicstar%d: drain_scq() called, scq at 0x%p, pos %d.\n",
1916 card->index, scq, pos);
1917 if (pos >= scq->num_entries) {
1922 spin_lock_irqsave(&scq->lock, flags);
1923 i = (int)(scq->tail - scq->base);
1924 if (++i == scq->num_entries)
1927 skb = scq->skb[i];
1941 scq->skb[i] = NULL;
1943 if (++i == scq->num_entries)
1946 scq->tail = scq->base + pos;
1947 spin_unlock_irqrestore(&scq->lock, flags);