Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

atm: [he] remove #ifdef clutter

Signed-off-by: Chas Williams <chas@cmf.nrl.navy.mil>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Chas Williams and committed by
David S. Miller
7255ca3f 97928f70

-178
-152
drivers/atm/he.c
··· 75 75 #include <linux/atm.h> 76 76 #include <linux/sonet.h> 77 77 78 - #define USE_TASKLET 79 78 #undef USE_SCATTERGATHER 80 79 #undef USE_CHECKSUM_HW /* still confused about this */ 81 - #define USE_RBPS 82 - #undef USE_RBPS_POOL /* if memory is tight try this */ 83 - #undef USE_RBPL_POOL /* if memory is tight try this */ 84 - #define USE_TPD_POOL 85 - /* #undef CONFIG_ATM_HE_USE_SUNI */ 86 80 /* #undef HE_DEBUG */ 87 81 88 82 #include "he.h" ··· 382 388 he_dev->atm_dev->dev_data = he_dev; 383 389 atm_dev->dev_data = he_dev; 384 390 he_dev->number = atm_dev->number; 385 - #ifdef USE_TASKLET 386 391 tasklet_init(&he_dev->tasklet, he_tasklet, (unsigned long) he_dev); 387 - #endif 388 392 spin_lock_init(&he_dev->global_lock); 389 393 390 394 if (he_start(atm_dev)) { ··· 779 787 { 780 788 int i; 781 789 782 - #ifdef USE_RBPS 783 790 /* small buffer pool */ 784 - #ifdef USE_RBPS_POOL 785 791 he_dev->rbps_pool = pci_pool_create("rbps", he_dev->pci_dev, 786 792 CONFIG_RBPS_BUFSIZE, 8, 0); 787 793 if (he_dev->rbps_pool == NULL) { 788 794 hprintk("unable to create rbps pages\n"); 789 795 return -ENOMEM; 790 796 } 791 - #else /* !USE_RBPS_POOL */ 792 - he_dev->rbps_pages = pci_alloc_consistent(he_dev->pci_dev, 793 - CONFIG_RBPS_SIZE * CONFIG_RBPS_BUFSIZE, &he_dev->rbps_pages_phys); 794 - if (he_dev->rbps_pages == NULL) { 795 - hprintk("unable to create rbps page pool\n"); 796 - return -ENOMEM; 797 - } 798 - #endif /* USE_RBPS_POOL */ 799 797 800 798 he_dev->rbps_base = pci_alloc_consistent(he_dev->pci_dev, 801 799 CONFIG_RBPS_SIZE * sizeof(struct he_rbp), &he_dev->rbps_phys); ··· 800 818 dma_addr_t dma_handle; 801 819 void *cpuaddr; 802 820 803 - #ifdef USE_RBPS_POOL 804 821 cpuaddr = pci_pool_alloc(he_dev->rbps_pool, GFP_KERNEL|GFP_DMA, &dma_handle); 805 822 if (cpuaddr == NULL) 806 823 return -ENOMEM; 807 - #else 808 - cpuaddr = he_dev->rbps_pages + (i * CONFIG_RBPS_BUFSIZE); 809 - dma_handle = he_dev->rbps_pages_phys + (i * CONFIG_RBPS_BUFSIZE); 810 - #endif 811 824 812 825 he_dev->rbps_virt[i].virt = cpuaddr; 813 826 he_dev->rbps_base[i].status = RBP_LOANED | RBP_SMALLBUF | (i << RBP_INDEX_OFF); ··· 821 844 RBP_QSIZE(CONFIG_RBPS_SIZE - 1) | 822 845 RBP_INT_ENB, 823 846 G0_RBPS_QI + (group * 32)); 824 - #else /* !USE_RBPS */ 825 - he_writel(he_dev, 0x0, G0_RBPS_S + (group * 32)); 826 - he_writel(he_dev, 0x0, G0_RBPS_T + (group * 32)); 827 - he_writel(he_dev, 0x0, G0_RBPS_QI + (group * 32)); 828 - he_writel(he_dev, RBP_THRESH(0x1) | RBP_QSIZE(0x0), 829 - G0_RBPS_BS + (group * 32)); 830 - #endif /* USE_RBPS */ 831 847 832 848 /* large buffer pool */ 833 - #ifdef USE_RBPL_POOL 834 849 he_dev->rbpl_pool = pci_pool_create("rbpl", he_dev->pci_dev, 835 850 CONFIG_RBPL_BUFSIZE, 8, 0); 836 851 if (he_dev->rbpl_pool == NULL) { 837 852 hprintk("unable to create rbpl pool\n"); 838 853 return -ENOMEM; 839 854 } 840 - #else /* !USE_RBPL_POOL */ 841 - he_dev->rbpl_pages = (void *) pci_alloc_consistent(he_dev->pci_dev, 842 - CONFIG_RBPL_SIZE * CONFIG_RBPL_BUFSIZE, &he_dev->rbpl_pages_phys); 843 - if (he_dev->rbpl_pages == NULL) { 844 - hprintk("unable to create rbpl pages\n"); 845 - return -ENOMEM; 846 - } 847 - #endif /* USE_RBPL_POOL */ 848 855 849 856 he_dev->rbpl_base = pci_alloc_consistent(he_dev->pci_dev, 850 857 CONFIG_RBPL_SIZE * sizeof(struct he_rbp), &he_dev->rbpl_phys); ··· 843 882 dma_addr_t dma_handle; 844 883 void *cpuaddr; 845 884 846 - #ifdef USE_RBPL_POOL 847 885 cpuaddr = pci_pool_alloc(he_dev->rbpl_pool, GFP_KERNEL|GFP_DMA, &dma_handle); 848 886 if (cpuaddr == NULL) 849 887 return -ENOMEM; 850 - #else 851 - cpuaddr = he_dev->rbpl_pages + (i * CONFIG_RBPL_BUFSIZE); 852 - dma_handle = he_dev->rbpl_pages_phys + (i * CONFIG_RBPL_BUFSIZE); 853 - #endif 854 888 855 889 he_dev->rbpl_virt[i].virt = cpuaddr; 856 890 he_dev->rbpl_base[i].status = RBP_LOANED | (i << RBP_INDEX_OFF); ··· 1431 1475 1432 1476 he_init_tpdrq(he_dev); 1433 1477 1434 - #ifdef USE_TPD_POOL 1435 1478 he_dev->tpd_pool = pci_pool_create("tpd", he_dev->pci_dev, 1436 1479 sizeof(struct he_tpd), TPD_ALIGNMENT, 0); 1437 1480 if (he_dev->tpd_pool == NULL) { ··· 1439 1484 } 1440 1485 1441 1486 INIT_LIST_HEAD(&he_dev->outstanding_tpds); 1442 - #else 1443 - he_dev->tpd_base = (void *) pci_alloc_consistent(he_dev->pci_dev, 1444 - CONFIG_NUMTPDS * sizeof(struct he_tpd), &he_dev->tpd_base_phys); 1445 - if (!he_dev->tpd_base) 1446 - return -ENOMEM; 1447 - 1448 - for (i = 0; i < CONFIG_NUMTPDS; ++i) { 1449 - he_dev->tpd_base[i].status = (i << TPD_ADDR_SHIFT); 1450 - he_dev->tpd_base[i].inuse = 0; 1451 - } 1452 - 1453 - he_dev->tpd_head = he_dev->tpd_base; 1454 - he_dev->tpd_end = &he_dev->tpd_base[CONFIG_NUMTPDS - 1]; 1455 - #endif 1456 1487 1457 1488 if (he_init_group(he_dev, 0) != 0) 1458 1489 return -ENOMEM; ··· 1547 1606 gen_cntl_0 &= ~(INT_PROC_ENBL | INIT_ENB); 1548 1607 pci_write_config_dword(pci_dev, GEN_CNTL_0, gen_cntl_0); 1549 1608 1550 - #ifdef USE_TASKLET 1551 1609 tasklet_disable(&he_dev->tasklet); 1552 - #endif 1553 1610 1554 1611 /* disable recv and transmit */ 1555 1612 ··· 1577 1638 he_dev->hsp, he_dev->hsp_phys); 1578 1639 1579 1640 if (he_dev->rbpl_base) { 1580 - #ifdef USE_RBPL_POOL 1581 1641 int i; 1582 1642 1583 1643 for (i = 0; i < CONFIG_RBPL_SIZE; ++i) { ··· 1585 1647 1586 1648 pci_pool_free(he_dev->rbpl_pool, cpuaddr, dma_handle); 1587 1649 } 1588 - #else 1589 - pci_free_consistent(he_dev->pci_dev, CONFIG_RBPL_SIZE 1590 - * CONFIG_RBPL_BUFSIZE, he_dev->rbpl_pages, he_dev->rbpl_pages_phys); 1591 - #endif 1592 1650 pci_free_consistent(he_dev->pci_dev, CONFIG_RBPL_SIZE 1593 1651 * sizeof(struct he_rbp), he_dev->rbpl_base, he_dev->rbpl_phys); 1594 1652 } 1595 1653 1596 - #ifdef USE_RBPL_POOL 1597 1654 if (he_dev->rbpl_pool) 1598 1655 pci_pool_destroy(he_dev->rbpl_pool); 1599 - #endif 1600 1656 1601 - #ifdef USE_RBPS 1602 1657 if (he_dev->rbps_base) { 1603 - #ifdef USE_RBPS_POOL 1604 1658 int i; 1605 1659 1606 1660 for (i = 0; i < CONFIG_RBPS_SIZE; ++i) { ··· 1601 1671 1602 1672 pci_pool_free(he_dev->rbps_pool, cpuaddr, dma_handle); 1603 1673 } 1604 - #else 1605 - pci_free_consistent(he_dev->pci_dev, CONFIG_RBPS_SIZE 1606 - * CONFIG_RBPS_BUFSIZE, he_dev->rbps_pages, he_dev->rbps_pages_phys); 1607 - #endif 1608 1674 pci_free_consistent(he_dev->pci_dev, CONFIG_RBPS_SIZE 1609 1675 * sizeof(struct he_rbp), he_dev->rbps_base, he_dev->rbps_phys); 1610 1676 } 1611 1677 1612 - #ifdef USE_RBPS_POOL 1613 1678 if (he_dev->rbps_pool) 1614 1679 pci_pool_destroy(he_dev->rbps_pool); 1615 - #endif 1616 - 1617 - #endif /* USE_RBPS */ 1618 1680 1619 1681 if (he_dev->rbrq_base) 1620 1682 pci_free_consistent(he_dev->pci_dev, CONFIG_RBRQ_SIZE * sizeof(struct he_rbrq), ··· 1620 1698 pci_free_consistent(he_dev->pci_dev, CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq), 1621 1699 he_dev->tpdrq_base, he_dev->tpdrq_phys); 1622 1700 1623 - #ifdef USE_TPD_POOL 1624 1701 if (he_dev->tpd_pool) 1625 1702 pci_pool_destroy(he_dev->tpd_pool); 1626 - #else 1627 - if (he_dev->tpd_base) 1628 - pci_free_consistent(he_dev->pci_dev, CONFIG_NUMTPDS * sizeof(struct he_tpd), 1629 - he_dev->tpd_base, he_dev->tpd_base_phys); 1630 - #endif 1631 1703 1632 1704 if (he_dev->pci_dev) { 1633 1705 pci_read_config_word(he_dev->pci_dev, PCI_COMMAND, &command); ··· 1636 1720 static struct he_tpd * 1637 1721 __alloc_tpd(struct he_dev *he_dev) 1638 1722 { 1639 - #ifdef USE_TPD_POOL 1640 1723 struct he_tpd *tpd; 1641 1724 dma_addr_t dma_handle; 1642 1725 ··· 1650 1735 tpd->iovec[2].addr = 0; tpd->iovec[2].len = 0; 1651 1736 1652 1737 return tpd; 1653 - #else 1654 - int i; 1655 - 1656 - for (i = 0; i < CONFIG_NUMTPDS; ++i) { 1657 - ++he_dev->tpd_head; 1658 - if (he_dev->tpd_head > he_dev->tpd_end) { 1659 - he_dev->tpd_head = he_dev->tpd_base; 1660 - } 1661 - 1662 - if (!he_dev->tpd_head->inuse) { 1663 - he_dev->tpd_head->inuse = 1; 1664 - he_dev->tpd_head->status &= TPD_MASK; 1665 - he_dev->tpd_head->iovec[0].addr = 0; he_dev->tpd_head->iovec[0].len = 0; 1666 - he_dev->tpd_head->iovec[1].addr = 0; he_dev->tpd_head->iovec[1].len = 0; 1667 - he_dev->tpd_head->iovec[2].addr = 0; he_dev->tpd_head->iovec[2].len = 0; 1668 - return he_dev->tpd_head; 1669 - } 1670 - } 1671 - hprintk("out of tpds -- increase CONFIG_NUMTPDS (%d)\n", CONFIG_NUMTPDS); 1672 - return NULL; 1673 - #endif 1674 1738 } 1675 1739 1676 1740 #define AAL5_LEN(buf,len) \ ··· 1698 1804 RBRQ_CON_CLOSED(he_dev->rbrq_head) ? " CON_CLOSED" : "", 1699 1805 RBRQ_HBUF_ERR(he_dev->rbrq_head) ? " HBUF_ERR" : ""); 1700 1806 1701 - #ifdef USE_RBPS 1702 1807 if (RBRQ_ADDR(he_dev->rbrq_head) & RBP_SMALLBUF) 1703 1808 rbp = &he_dev->rbps_base[RBP_INDEX(RBRQ_ADDR(he_dev->rbrq_head))]; 1704 1809 else 1705 - #endif 1706 1810 rbp = &he_dev->rbpl_base[RBP_INDEX(RBRQ_ADDR(he_dev->rbrq_head))]; 1707 1811 1708 1812 buf_len = RBRQ_BUFLEN(he_dev->rbrq_head) * 4; ··· 1779 1887 1780 1888 for (iov = he_vcc->iov_head; 1781 1889 iov < he_vcc->iov_tail; ++iov) { 1782 - #ifdef USE_RBPS 1783 1890 if (iov->iov_base & RBP_SMALLBUF) 1784 1891 memcpy(skb_put(skb, iov->iov_len), 1785 1892 he_dev->rbps_virt[RBP_INDEX(iov->iov_base)].virt, iov->iov_len); 1786 1893 else 1787 - #endif 1788 1894 memcpy(skb_put(skb, iov->iov_len), 1789 1895 he_dev->rbpl_virt[RBP_INDEX(iov->iov_base)].virt, iov->iov_len); 1790 1896 } ··· 1827 1937 1828 1938 for (iov = he_vcc->iov_head; 1829 1939 iov < he_vcc->iov_tail; ++iov) { 1830 - #ifdef USE_RBPS 1831 1940 if (iov->iov_base & RBP_SMALLBUF) 1832 1941 rbp = &he_dev->rbps_base[RBP_INDEX(iov->iov_base)]; 1833 1942 else 1834 - #endif 1835 1943 rbp = &he_dev->rbpl_base[RBP_INDEX(iov->iov_base)]; 1836 1944 1837 1945 rbp->status &= ~RBP_LOANED; ··· 1865 1977 he_dev->hsp->group[group].tbrq_tail); 1866 1978 struct he_tpd *tpd; 1867 1979 int slot, updated = 0; 1868 - #ifdef USE_TPD_POOL 1869 1980 struct he_tpd *__tpd; 1870 - #endif 1871 1981 1872 1982 /* 2.1.6 transmit buffer return queue */ 1873 1983 ··· 1877 1991 TBRQ_TPD(he_dev->tbrq_head), 1878 1992 TBRQ_EOS(he_dev->tbrq_head) ? " EOS" : "", 1879 1993 TBRQ_MULTIPLE(he_dev->tbrq_head) ? " MULTIPLE" : ""); 1880 - #ifdef USE_TPD_POOL 1881 1994 tpd = NULL; 1882 1995 list_for_each_entry(__tpd, &he_dev->outstanding_tpds, entry) { 1883 1996 if (TPD_ADDR(__tpd->status) == TBRQ_TPD(he_dev->tbrq_head)) { ··· 1891 2006 TBRQ_TPD(he_dev->tbrq_head)); 1892 2007 goto next_tbrq_entry; 1893 2008 } 1894 - #else 1895 - tpd = &he_dev->tpd_base[ TPD_INDEX(TBRQ_TPD(he_dev->tbrq_head)) ]; 1896 - #endif 1897 2009 1898 2010 if (TBRQ_EOS(he_dev->tbrq_head)) { 1899 2011 HPRINTK("wake_up(tx_waitq) cid 0x%x\n", ··· 1920 2038 } 1921 2039 1922 2040 next_tbrq_entry: 1923 - #ifdef USE_TPD_POOL 1924 2041 if (tpd) 1925 2042 pci_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status)); 1926 - #else 1927 - tpd->inuse = 0; 1928 - #endif 1929 2043 he_dev->tbrq_head = (struct he_tbrq *) 1930 2044 ((unsigned long) he_dev->tbrq_base | 1931 2045 TBRQ_MASK(++he_dev->tbrq_head)); ··· 1964 2086 he_writel(he_dev, RBPL_MASK(he_dev->rbpl_tail), G0_RBPL_T); 1965 2087 } 1966 2088 1967 - #ifdef USE_RBPS 1968 2089 static void 1969 2090 he_service_rbps(struct he_dev *he_dev, int group) 1970 2091 { ··· 1990 2113 if (moved) 1991 2114 he_writel(he_dev, RBPS_MASK(he_dev->rbps_tail), G0_RBPS_T); 1992 2115 } 1993 - #endif /* USE_RBPS */ 1994 2116 1995 2117 static void 1996 2118 he_tasklet(unsigned long data) ··· 2000 2124 int updated = 0; 2001 2125 2002 2126 HPRINTK("tasklet (0x%lx)\n", data); 2003 - #ifdef USE_TASKLET 2004 2127 spin_lock_irqsave(&he_dev->global_lock, flags); 2005 - #endif 2006 2128 2007 2129 while (he_dev->irq_head != he_dev->irq_tail) { 2008 2130 ++updated; ··· 2015 2141 case ITYPE_RBRQ_TIMER: 2016 2142 if (he_service_rbrq(he_dev, group)) { 2017 2143 he_service_rbpl(he_dev, group); 2018 - #ifdef USE_RBPS 2019 2144 he_service_rbps(he_dev, group); 2020 - #endif /* USE_RBPS */ 2021 2145 } 2022 2146 break; 2023 2147 case ITYPE_TBRQ_THRESH: ··· 2028 2156 he_service_rbpl(he_dev, group); 2029 2157 break; 2030 2158 case ITYPE_RBPS_THRESH: 2031 - #ifdef USE_RBPS 2032 2159 he_service_rbps(he_dev, group); 2033 - #endif /* USE_RBPS */ 2034 2160 break; 2035 2161 case ITYPE_PHY: 2036 2162 HPRINTK("phy interrupt\n"); ··· 2056 2186 2057 2187 he_service_rbrq(he_dev, 0); 2058 2188 he_service_rbpl(he_dev, 0); 2059 - #ifdef USE_RBPS 2060 2189 he_service_rbps(he_dev, 0); 2061 - #endif /* USE_RBPS */ 2062 2190 he_service_tbrq(he_dev, 0); 2063 2191 break; 2064 2192 default: ··· 2078 2210 IRQ_TAIL(he_dev->irq_tail), IRQ0_HEAD); 2079 2211 (void) he_readl(he_dev, INT_FIFO); /* 8.1.2 controller errata; flush posted writes */ 2080 2212 } 2081 - #ifdef USE_TASKLET 2082 2213 spin_unlock_irqrestore(&he_dev->global_lock, flags); 2083 - #endif 2084 2214 } 2085 2215 2086 2216 static irqreturn_t ··· 2110 2244 2111 2245 if (he_dev->irq_head != he_dev->irq_tail) { 2112 2246 handled = 1; 2113 - #ifdef USE_TASKLET 2114 2247 tasklet_schedule(&he_dev->tasklet); 2115 - #else 2116 - he_tasklet((unsigned long) he_dev); 2117 - #endif 2118 2248 he_writel(he_dev, INT_CLEAR_A, INT_FIFO); /* clear interrupt */ 2119 2249 (void) he_readl(he_dev, INT_FIFO); /* flush posted writes */ 2120 2250 } ··· 2167 2305 dev_kfree_skb_any(tpd->skb); 2168 2306 atomic_inc(&tpd->vcc->stats->tx_err); 2169 2307 } 2170 - #ifdef USE_TPD_POOL 2171 2308 pci_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status)); 2172 - #else 2173 - tpd->inuse = 0; 2174 - #endif 2175 2309 return; 2176 2310 } 2177 2311 } 2178 2312 2179 2313 /* 2.1.5 transmit packet descriptor ready queue */ 2180 - #ifdef USE_TPD_POOL 2181 2314 list_add_tail(&tpd->entry, &he_dev->outstanding_tpds); 2182 2315 he_dev->tpdrq_tail->tpd = TPD_ADDR(tpd->status); 2183 - #else 2184 - he_dev->tpdrq_tail->tpd = he_dev->tpd_base_phys + 2185 - (TPD_INDEX(tpd->status) * sizeof(struct he_tpd)); 2186 - #endif 2187 2316 he_dev->tpdrq_tail->cid = cid; 2188 2317 wmb(); 2189 2318 ··· 2364 2511 goto open_failed; 2365 2512 } 2366 2513 2367 - #ifdef USE_RBPS 2368 2514 rsr1 = RSR1_GROUP(0); 2369 2515 rsr4 = RSR4_GROUP(0); 2370 - #else /* !USE_RBPS */ 2371 - rsr1 = RSR1_GROUP(0)|RSR1_RBPL_ONLY; 2372 - rsr4 = RSR4_GROUP(0)|RSR4_RBPL_ONLY; 2373 - #endif /* USE_RBPS */ 2374 2516 rsr0 = vcc->qos.rxtp.traffic_class == ATM_UBR ? 2375 2517 (RSR0_EPD_ENABLE|RSR0_PPD_ENABLE) : 0; 2376 2518
-26
drivers/atm/he.h
··· 51 51 #define CONFIG_IRQ_SIZE 128 52 52 #define CONFIG_IRQ_THRESH (CONFIG_IRQ_SIZE/2) 53 53 54 - #define CONFIG_NUMTPDS 256 55 - 56 54 #define CONFIG_TPDRQ_SIZE 512 57 55 #define TPDRQ_MASK(x) (((unsigned long)(x))&((CONFIG_TPDRQ_SIZE<<3)-1)) 58 56 ··· 138 140 struct sk_buff *skb; 139 141 struct atm_vcc *vcc; 140 142 141 - #ifdef USE_TPD_POOL 142 143 struct list_head entry; 143 - #else 144 - u32 inuse; 145 - char padding[32 - sizeof(u32) - (2*sizeof(void*))]; 146 - #endif 147 144 }; 148 145 149 146 #define TPD_ALIGNMENT 64 ··· 284 291 volatile unsigned *irq_tailoffset; 285 292 int irq_peak; 286 293 287 - #ifdef USE_TASKLET 288 294 struct tasklet_struct tasklet; 289 - #endif 290 - #ifdef USE_TPD_POOL 291 295 struct pci_pool *tpd_pool; 292 296 struct list_head outstanding_tpds; 293 - #else 294 - struct he_tpd *tpd_head, *tpd_base, *tpd_end; 295 - dma_addr_t tpd_base_phys; 296 - #endif 297 297 298 298 dma_addr_t tpdrq_phys; 299 299 struct he_tpdrq *tpdrq_base, *tpdrq_tail, *tpdrq_head; ··· 297 311 struct he_rbrq *rbrq_base, *rbrq_head; 298 312 int rbrq_peak; 299 313 300 - #ifdef USE_RBPL_POOL 301 314 struct pci_pool *rbpl_pool; 302 - #else 303 - void *rbpl_pages; 304 - dma_addr_t rbpl_pages_phys; 305 - #endif 306 315 dma_addr_t rbpl_phys; 307 316 struct he_rbp *rbpl_base, *rbpl_tail; 308 317 struct he_virt *rbpl_virt; 309 318 int rbpl_peak; 310 319 311 - #ifdef USE_RBPS 312 - #ifdef USE_RBPS_POOL 313 320 struct pci_pool *rbps_pool; 314 - #else 315 - void *rbps_pages; 316 - dma_addr_t rbps_pages_phys; 317 - #endif 318 - #endif 319 321 dma_addr_t rbps_phys; 320 322 struct he_rbp *rbps_base, *rbps_tail; 321 323 struct he_virt *rbps_virt;