/* * ---------------------------------------------------------------- * Copyright c Realtek Semiconductor Corporation, 2002 * All rights reserved. * * $Header: /usr/local/dslrepos/linux-2.6.30/drivers/net/rtl819x/rtl865xc_swNic.h,v 1.7 2012/03/29 03:26:07 paula Exp $ * * Abstract: Switch core polling mode NIC header file. * * $Author: paula $ * * $Log: rtl865xc_swNic.h,v $ * Revision 1.7 2012/03/29 03:26:07 paula * increase descriptor ring size * * Revision 1.6 2011/08/03 08:15:26 tylo * ETH_REFILL_THRESHOLD5 should smaller than NUM_RX_PKTHDR_DESC5 * * Revision 1.5 2011/08/02 12:11:22 tylo * decrease rx ring size * * Revision 1.4 2011/07/11 09:00:05 cathy * update NUM_TX_PKTHDR_DESC from 64 to 256 for 8192cd's throughput * * Revision 1.3 2011/06/16 05:53:48 ikevin362 * cpu IPQos support, change some para. * * Revision 1.2 2011/04/11 12:45:18 tylo * update hw nat driver from AP team * * Revision 1.3 2008/04/11 10:12:38 bo_zhao * *: swap nic drive to 8186 style * * Revision 1.2 2007/11/11 02:51:27 davidhsu * Fix the bug that do not fre rx skb in rx descriptor when driver is shutdown * * Revision 1.1.1.1 2007/08/06 10:04:52 root * Initial import source to CVS * * Revision 1.4 2006/09/15 03:53:39 ghhuang * +: Add TFTP download support for RTL8652 FPGA * * Revision 1.3 2005/09/22 05:22:31 bo_zhao * *** empty log message *** * * Revision 1.1.1.1 2005/09/05 12:38:24 alva * initial import for add TFTP server * * Revision 1.2 2004/03/31 01:49:20 yjlou * *: all text files are converted to UNIX format. * * Revision 1.1 2004/03/16 06:36:13 yjlou * *** empty log message *** * * Revision 1.1.1.1 2003/09/25 08:16:56 tony * initial loader tree * * Revision 1.1.1.1 2003/05/07 08:16:07 danwu * no message * * --------------------------------------------------------------- */ #ifndef RTL865XC_SWNIC_H #define RTL865XC_SWNIC_H #if defined(CONFIG_RTL_HW_QOS_SUPPORT) #define RTL_MULTIPLE_RX_TX_RING 1 /*enable multiple input queue(multiple rx ring)*/ #endif #define RTL865X_SWNIC_RXRING_HW_PKTDESC 6 #ifdef CONFIG_RTL_8196D #define RTL865X_SWNIC_TXRING_HW_PKTDESC 4 #else #define RTL865X_SWNIC_TXRING_HW_PKTDESC 2 #endif #if defined(CONFIG_RTL_8198) && !defined(CONFIG_RTL_8198_AP_ROOT) #define MAX_PRE_ALLOC_RX_SKB 512 #define NUM_RX_PKTHDR_DESC 512 #define NUM_TX_PKTHDR_DESC 1024 #define ETH_REFILL_THRESHOLD 128 // must < NUM_RX_PKTHDR_DESC #else #ifdef DELAY_REFILL_ETH_RX_BUF #if defined(CONFIG_RTL8685S) || defined(CONFIG_RTL8685SB) #define MAX_PRE_ALLOC_RX_SKB 128 //ori=304 #else #define MAX_PRE_ALLOC_RX_SKB 304 #endif #ifdef CONFIG_FAST_FORWARDING #define NUM_RX_PKTHDR_DESC 512 #else #define NUM_RX_PKTHDR_DESC 256 #endif//end of CONFIG_FAST_FORWARDING #define ETH_REFILL_THRESHOLD 96 // must < NUM_RX_PKTHDR_DESC #define NUM_TX_PKTHDR_DESC 512 #else #define MAX_PRE_ALLOC_RX_SKB 3072 #define NUM_RX_PKTHDR_DESC 1024 #define ETH_REFILL_THRESHOLD 96 // must < NUM_RX_PKTHDR_DESC #define NUM_TX_PKTHDR_DESC 1024 #endif #endif #ifdef CONFIG_RTK_SWCORE_OVERWRITE_DESC_SIZE #undef NUM_RX_PKTHDR_DESC #undef NUM_TX_PKTHDR_DESC #undef MAX_PRE_ALLOC_RX_SKB #define NUM_RX_PKTHDR_DESC CONFIG_RTK_SWCORE_RX_DESC_NUM #define NUM_TX_PKTHDR_DESC CONFIG_RTK_SWCORE_TX_DESC_NUM #define MAX_PRE_ALLOC_RX_SKB CONFIG_RTK_SWCORE_PREALLOC_DESC_NUM #endif #if defined(RTL_MULTIPLE_RX_TX_RING) //#define RTL_CPU_QOS_ENABLED 1 #define RTL865X_SWNIC_RXRING_MAX_PKTDESC 6 #define RTL865X_SWNIC_TXRING_MAX_PKTDESC 2 /* By default, only using rxring 0 and rxring 5 * in order to make different between low/high * priority */ #define NUM_RX_PKTHDR_DESC1 0 #define NUM_RX_PKTHDR_DESC2 0 #define NUM_RX_PKTHDR_DESC3 0 #define NUM_RX_PKTHDR_DESC4 0 #define NUM_RX_PKTHDR_DESC5 64 #if defined(CONFIG_RTK_SKB_PRIO_ASSIGNMENT) #define NUM_TX_PKTHDR_DESC1 128 /*NUM_TX_PKTHDR_DESC*/ #else #define NUM_TX_PKTHDR_DESC1 8 /*NUM_TX_PKTHDR_DESC*/ #endif #ifdef CONFIG_RTL_8196D #define NUM_TX_PKTHDR_DESC2 2 #define NUM_TX_PKTHDR_DESC3 2 #endif #define ETH_REFILL_THRESHOLD1 0 // must < NUM_RX_PKTHDR_DESC1 #define ETH_REFILL_THRESHOLD2 0 // must < NUM_RX_PKTHDR_DESC2 #define ETH_REFILL_THRESHOLD3 0 // must < NUM_RX_PKTHDR_DESC3 #define ETH_REFILL_THRESHOLD4 0 // must < NUM_RX_PKTHDR_DESC4 #define ETH_REFILL_THRESHOLD5 NUM_RX_PKTHDR_DESC5/2 // must < NUM_RX_PKTHDR_DESC5 #define QUEUEID0_RXRING_MAPPING 0x0000 #define QUEUEID1_RXRING_MAPPING 0x0000 #define QUEUEID2_RXRING_MAPPING 0x0000 //0x5555 #define QUEUEID3_RXRING_MAPPING 0x0000 //0x5555 #define QUEUEID4_RXRING_MAPPING 0x0000 //0x5555 #ifdef CONFIG_RTL_8685_8PRIQUE #define QUEUEID5_RXRING_MAPPING 0x0000 #define QUEUEID6_RXRING_MAPPING 0x0000 #define QUEUEID7_RXRING_MAPPING 0x5555 #else #define QUEUEID5_RXRING_MAPPING 0x5555 #endif #else #define RTL865X_SWNIC_RXRING_MAX_PKTDESC 1 #define RTL865X_SWNIC_TXRING_MAX_PKTDESC 1 #define NUM_RX_PKTHDR_DESC1 0 #define NUM_RX_PKTHDR_DESC2 0 #define NUM_RX_PKTHDR_DESC3 0 #define NUM_RX_PKTHDR_DESC4 0 #define NUM_RX_PKTHDR_DESC5 0 #define NUM_TX_PKTHDR_DESC1 4 #ifdef CONFIG_RTL_8196D #define NUM_TX_PKTHDR_DESC2 2 #define NUM_TX_PKTHDR_DESC3 2 #endif #define ETH_REFILL_THRESHOLD1 0 // must < NUM_RX_PKTHDR_DESC #define ETH_REFILL_THRESHOLD2 0 // must < NUM_RX_PKTHDR_DESC #define ETH_REFILL_THRESHOLD3 0 // must < NUM_RX_PKTHDR_DESC #define ETH_REFILL_THRESHOLD4 0 // must < NUM_RX_PKTHDR_DESC #define ETH_REFILL_THRESHOLD5 0 // must < NUM_RX_PKTHDR_DESC #define QUEUEID0_RXRING_MAPPING 0 #define QUEUEID1_RXRING_MAPPING 0 #define QUEUEID2_RXRING_MAPPING 0 #define QUEUEID3_RXRING_MAPPING 0 #define QUEUEID4_RXRING_MAPPING 0 #define QUEUEID5_RXRING_MAPPING 0 #define QUEUEID6_RXRING_MAPPING 0 #define QUEUEID7_RXRING_MAPPING 0 #endif #define RX_MULTIRING_BITMAP ((NUM_RX_PKTHDR_DESC ? 1 : 0) | (NUM_RX_PKTHDR_DESC1? 1<<1 : 0) | (NUM_RX_PKTHDR_DESC2? 1<<2 : 0) | (NUM_RX_PKTHDR_DESC3? 1<<3 : 0) | (NUM_RX_PKTHDR_DESC4? 1<<4 : 0) | (NUM_RX_PKTHDR_DESC5? 1<<5 : 0)) #define RX_ONLY_RING0 ((RX_MULTIRING_BITMAP == 1)? 1 : 0) /* refer to rtl865xc_swNic.c & rtl865xc_swNic.h */ #define UNCACHE_MASK 0x20000000 /* rxPreProcess */ #define RTL8651_CPU_PORT 0x07 /* in rtl8651_tblDrv.h */ #define _RTL865XB_EXTPORTMASKS 7 /*romedriver modify Boyce 2014-07-10*/ #if defined(CONFIG_XDSL_NEW_HWNAT_DRIVER) && defined(CONFIG_XDSL_ROMEDRIVER) //copy from fwdEngine enum RE8670_STATUS_REGS { /*TX/RX share */ DescOwn = (1 << 31), /* Descriptor is owned by NIC */ RingEnd = (1 << 30), /* End of descriptor ring */ FirstFrag = (1 << 29), /* First segment of a packet */ LastFrag = (1 << 28), /* Final segment of a packet */ /*Tx descriptor opt1*/ IPCS = (1 << 27), L4CS = (1 << 26), KEEP = (1 << 25), BLU = (1 << 24), TxCRC = (1 << 23), VSEL = (1 << 22), DisLrn = (1 << 21), CPUTag_ipcs = (1 << 20), CPUTag_l4cs = (1 << 19), /*Tx descriptor opt2*/ CPUTag = (1 << 31), aspri = (1 << 30), CPRI = (1 << 27), TxVLAN_int = (0 << 25), //intact TxVLAN_ins = (1 << 25), //insert TxVLAN_rm = (2 << 25), //remove TxVLAN_re = (3 << 25), //remark //TxPPPoEAct = (1 << 23), TxPPPoEAct = 23, //TxPPPoEIdx = (1 << 20), TxPPPoEIdx = 20, Efid = (1 << 19), //Enhan_Fid = (1 << 16), Enhan_Fid = 16, /*Tx descriptor opt3*/ SrcExtPort = 29, TxDesPortM = 23, TxDesStrID = 16, TxDesVCM = 0, /*Tx descriptor opt4*/ /*Rx descriptor opt1*/ CRCErr = (1 << 27), IPV4CSF = (1 << 26), L4CSF = (1 << 25), RCDF = (1 << 24), IP_FRAG = (1 << 23), PPPoE_tag = (1 << 22), RWT = (1 << 21), PktType = (1 << 17), RxProtoIP = 1, RxProtoPPTP = 2, RxProtoICMP = 3, RxProtoIGMP = 4, RxProtoTCP = 5, RxProtoUDP = 6, RxProtoIPv6 = 7, RxProtoICMPv6 = 8, RxProtoTCPv6 = 9, RxProtoUDPv6 = 10, L3route = (1 << 16), OrigFormat = (1 << 15), PCTRL = (1 << 14), /*Rx descriptor opt2*/ PTPinCPU = (1 << 30), SVlanTag = (1 << 29), /*Rx descriptor opt3*/ SrcPort = (1 << 27), DesPortM = (1 << 21), Reason = (1 << 13), IntPriority = (1 << 10), ExtPortTTL = (1 << 5), }; typedef struct dma_tx_desc { u32 opts1; u32 addr; u32 opts2; u32 opts3; //cputag u32 opts4; //lso }DMA_TX_DESC; typedef struct dma_rx_desc { u32 opts1; u32 addr; u32 opts2; u32 opts3; }DMA_RX_DESC; struct ring_info { struct sk_buff *skb; dma_addr_t mapping; unsigned frag; }; struct cp_extra_stats { unsigned long rx_frags; unsigned long tx_timeouts; //krammer add for rx info unsigned int rx_hw_num; unsigned int rx_sw_num; unsigned int rer_runt; unsigned int rer_ovf; unsigned int rdu; unsigned int frag; #ifdef CONFIG_RG_JUMBO_FRAME unsigned int toobig; #endif unsigned int crcerr; unsigned int rcdf; unsigned int rx_no_mem; //krammer add for tx info unsigned int tx_sw_num; unsigned int tx_hw_num; unsigned int tx_no_desc; }; struct rx_info{ union{ struct{ unsigned int own:1;//31 unsigned int eor:1;//30 unsigned int fs:1;//29 unsigned int ls:1;//28 unsigned int crcerr:1;//27 unsigned int ipv4csf:1;//26 unsigned int l4csf:1;//25 unsigned int rcdf:1;//24 unsigned int ipfrag:1;//23 unsigned int pppoetag:1;//22 unsigned int rwt:1;//21 unsigned int pkttype:4;//17~20 unsigned int l3routing:1;//16 unsigned int origformat:1;//15 unsigned int pctrl:1;//14 #ifdef CONFIG_RG_JUMBO_FRAME unsigned int data_length:14;//0~13 #else unsigned int rsvd:2;//12~13 unsigned int data_length:12;//0~11 #endif }bit; unsigned int dw;//double word }opts1; unsigned int addr; union{ struct{ unsigned int cputag:1;//31 unsigned int ptp_in_cpu_tag_exist:1;//30 unsigned int svlan_tag_exist:1;//29 unsigned int rsvd_2:2;//27~28 unsigned int pon_stream_id:7;//20~26 unsigned int rsvd_1:3;//17~19 unsigned int ctagva:1;//16 unsigned int cvlan_tag:16;//0~15 }bit; unsigned int dw;//double word }opts2; union{ struct{ unsigned int src_port_num:5;//27~31 unsigned int dst_port_mask:6;//21~26 unsigned int reason:8;//13~20 unsigned int internal_priority:3;//10~12 unsigned int ext_port_ttl_1:5;//5~9 unsigned int rsvd:5;//0~4 }bit; unsigned int dw;//double word }opts3; }; struct tx_info{ union{ struct{ unsigned int own:1;//31 unsigned int eor:1;//30 unsigned int fs:1;//29 unsigned int ls:1;//28 unsigned int ipcs:1;//27 unsigned int l4cs:1;//26 unsigned int keep:1;//25 unsigned int blu:1;//24 unsigned int crc:1;//23 unsigned int vsel:1;//22 unsigned int dislrn:1;//21 unsigned int cputag_ipcs:1;//20 unsigned int cputag_l4cs:1;//19 unsigned int cputag_psel:1;//18 unsigned int rsvd:1;//17 unsigned int data_length:17;//0~16 }bit; unsigned int dw;//double word }opts1; unsigned int addr; union{ struct{ unsigned int cputag:1;//31 unsigned int aspri:1;//30 unsigned int cputag_pri:3;//27~29 unsigned int tx_vlan_action:2;//25~26 unsigned int tx_pppoe_action:2;//23~24 unsigned int tx_pppoe_idx:3;//20~22 unsigned int efid:1;//19 unsigned int enhance_fid:3;//16~18 unsigned int vidl:8;//8~15 unsigned int prio:3;//5~7 unsigned int cfi:1;// 4 unsigned int vidh:4;//0~3 }bit; unsigned int dw;//double word }opts2; union{ struct{ unsigned int extspa:3;//29~31 unsigned int tx_portmask:6;//23~28 unsigned int tx_dst_stream_id:7;//16~22 #if 0//def RTL0371 unsigned int tx_dst_vc_mask:16;//0~15 #else unsigned int rsvd:12;// 4~15 unsigned int rsv1:1;// 3 unsigned int rsv0:1;// 2 unsigned int l34_keep:1;// 1 unsigned int ptp:1;//0 #endif }bit; unsigned int dw;//double word }opts3; union{ unsigned int dw; }opts4; }; #define MAX_RXRING_NUM 6 #define MAX_TXRING_NUM 5 #define SW_PORT_NUM 7 struct re_private { void *regs; struct net_device *dev; spinlock_t lock; DMA_RX_DESC *rx_Mring[MAX_RXRING_NUM]; unsigned rx_Mtail[MAX_RXRING_NUM]; char* rxdesc_Mbuf[MAX_RXRING_NUM]; DMA_TX_DESC *tx_Mhqring[MAX_TXRING_NUM]; char* txdesc_Mbuf[MAX_TXRING_NUM]; unsigned tx_Mhqhead[MAX_TXRING_NUM]; unsigned tx_Mhqtail[MAX_TXRING_NUM]; struct ring_info *tx_skb[MAX_TXRING_NUM]; struct ring_info *rx_skb[MAX_RXRING_NUM]; #ifdef CONFIG_DUALBAND_CONCURRENT DMA_RX_DESC *default_rx_desc; char *default_rxdesc_Mbuf; struct ring_info *default_rx_skb; unsigned old_tx_Mhqhead[MAX_TXRING_NUM]; unsigned old_tx_Mhqtail[MAX_TXRING_NUM]; unsigned old_rx_Mtail[MAX_RXRING_NUM]; #endif unsigned rx_buf_sz; dma_addr_t ring_dma; u32 msg_enable; struct cp_extra_stats cp_stats; u32 isr_status; u32 isr1_status; struct pci_dev *pdev; u32 rx_config; struct sk_buff *frag_skb; unsigned dropping_frag : 1; //struct tq_struct rx_task; //struct tq_struct tx_task; struct tasklet_struct rx_tasklets; //struct tasklet_struct tx_tasklets; #if 1 struct tasklet_struct tx_tasklets; #endif struct net_device* port2dev[SW_PORT_NUM]; int (*port2rxfunc[SW_PORT_NUM])(struct re_private *cp, struct sk_buff *skb, struct rx_info *pRxInfo); #ifdef CONFIG_RG_SIMPLE_PROTOCOL_STACK struct net_device* multiWanDev[8]; //at most 7 WAN interface(reserved one interface for WAN) int wanInterfaceIdx; //used for multi-WAN in SPS #endif #ifdef CONFIG_RG_JUMBO_FRAME struct sk_buff *jumboFrame; unsigned short jumboLength; #endif }; #endif //end CONFIG_XDSL_NEW_HWNAT_DRIVER typedef struct { uint16 vid; uint16 pid; uint16 len; uint16 priority:3; uint16 rxPri:3; uint16 rxExtspa:2; uint16 dpext:4; uint16 rxOrg:1; uint16 rxFwd:1; void* input; struct dev_priv* priv; /*romedriver modify Boyce 2014-07-10*/ #if defined(CONFIG_XDSL_NEW_HWNAT_DRIVER) && defined(CONFIG_XDSL_ROMEDRIVER) struct rx_info RxInfo; #endif uint32 isPdev; } rtl_nicRx_info; typedef struct { uint16 vid; uint16 portlist; uint16 srcExtPort; uint16 flags; uint32 txIdx:1; #if defined(CONFIG_RTL_HW_QOS_SUPPORT) uint32 priority:3; uint32 queueId:3; #endif #if defined(CONFIG_RTL_8685S_HWNAT) uint32 _priority:3; //same as CONFIG_RTL_HW_QOS_SUPPORT priority,vlan priority uint32 _queueId:3; //same as CONFIG_RTL_HW_QOS_SUPPORT queueId,tx queue id uint32 CPUqueueId:3; uint16 replaceTxDesc:1; uint16 pktType:3; uint16 vlanTagged: 1; /* the tag status after ALE */ uint16 llcTagged: 1; /* the tag status after ALE */ uint16 pppeTagged: 1; /* the tag status after ALE */ uint16 pppoeIdx: 3; uint16 l3v4v6HdrFlag:3; //v4FIRST|v4HDR_FLAG|v6HDR_FLAG uint16 v6HdrLen; uint32 txCVlanTagAutoAdd; //port0-prot5 mask #endif #if defined(CONFIG_XDSL_NEW_HWNAT_DRIVER) && defined(CONFIG_XDSL_ROMEDRIVER) uint16 fromRomeDriver; struct tx_info* ptxInfo; #endif void *out_skb; } rtl_nicTx_info; #if defined(RTL_CPU_QOS_ENABLED) #define RTL_NIC_QUEUE_LEN (32) #define RTL_CPUQOS_TIMER_INTERVAL (HZ<<1) #define RTL_CPUQOS_PKTCNT_THRESHOLD (1000) #define RTL_ASSIGN_RX_PRIORITY ((highestPriority<cpuQosHoldLow)?((totalLowQueueCnt<RTL_CPUQOS_PKTCNT_THRESHOLD)?highestPriority:cpuQosHoldLow):highestPriority) typedef struct { int cnt; int start; int end; rtl_nicRx_info entry[RTL_NIC_QUEUE_LEN]; } rtl_queue_entry; #else #define RTL_ASSIGN_RX_PRIORITY 0 #endif /* -------------------------------------------------------------------- * ROUTINE NAME - swNic_init * -------------------------------------------------------------------- * FUNCTION: This service initializes the switch NIC. * INPUT : userNeedRxPkthdrRingCnt[RTL865X_SWNIC_RXRING_MAX_PKTDESC]: Number of Rx pkthdr descriptors. of each ring userNeedRxMbufRingCnt: Number of Rx mbuf descriptors. userNeedTxPkthdrRingCnt[RTL865X_SWNIC_TXRING_MAX_PKTDESC]: Number of Tx pkthdr descriptors. of each ring clusterSize: Size of a mbuf cluster. * OUTPUT : None. * RETURN : Upon successful completion, the function returns ENOERR. Otherwise, EINVAL: Invalid argument. * NOTE : None. * -------------------------------------------------------------------*/ int32 swNic_init(uint32 userNeedRxPkthdrRingCnt[], uint32 userNeedRxMbufRingCnt, uint32 userNeedTxPkthdrRingCnt[], uint32 clusterSize); /* -------------------------------------------------------------------- * ROUTINE NAME - swNic_intHandler * -------------------------------------------------------------------- * FUNCTION: This function is the NIC interrupt handler. * INPUT : intPending: Pending interrupts. * OUTPUT : None. * RETURN : None. * NOTE : None. * -------------------------------------------------------------------*/ void swNic_intHandler(uint32 intPending); int32 swNic_flushRxRingByPriority(int priority); int32 swNic_receive(rtl_nicRx_info *info); int32 swNic_send(void *skb, void * output, uint32 len, rtl_nicTx_info *nicTx); //__MIPS16 int32 swNic_txDone(int idx); void swNic_freeRxBuf(void); int32 swNic_txRunout(void); #if 0 int32 arpTableDump(void); int32 arpTableDelete(void); #endif #ifdef DELAY_REFILL_ETH_RX_BUF extern int return_to_rx_pkthdr_ring(unsigned char *head); #endif //extern uint32* rxMbufRing; extern unsigned char *alloc_rx_buf(void **skb, int buflen); extern void free_rx_buf(void *skb); extern void tx_done_callback(void *skb); extern void eth_save_and_cli(unsigned long *flags); extern void eth_restore_flags(unsigned long flags); #define RTL8651_IOCTL_GETWANLINKSTATUS 2000 #define RTL8651_IOCTL_GETLANLINKSTATUS 2001 #define RTL8651_IOCTL_GETWANTHROUGHPUT 2002 #define RTL8651_IOCTL_GETLANPORTLINKSTATUS 2003 #define RTL8651_IOCTL_GETWANPORTLINKSTATUS 2004 #define RTL8651_IOCTL_GETWANLINKSPEED 2100 //#define RTL8651_IOCTL_SETWANLINKSPEED 2101 #define RTL8651_IOCTL_GETLANLINKSTATUSALL 2105 #define RTL8651_IOCTL_SETWANLINKSTATUS 2200 #define RTL_NICRX_OK 0 #define RTL_NICRX_REPEAT -2 #define RTL_NICRX_NULL -1 #ifdef CONFIG_FAST_FORWARDING #define RTL_NICRX_FF -3 #endif//end of CONFIG_FAST_FORWARDING #if defined(CONFIG_RTL_PROC_DEBUG) int32 rtl_dumpRxRing(void); int32 rtl_dumpTxRing(void); int32 rtl_dumpMbufRing(void); #endif struct ring_que { int qlen; int qmax; int head; int tail; struct sk_buff **ring; }; static inline void *UNCACHED_MALLOC(int size) { printk("Warning: \n"); dump_stack(); return ((void *)(((uint32)kmalloc(size, GFP_ATOMIC)) | UNCACHE_MASK)); } static inline void *CACHED_MALLOC(int size) { return ((void *)(((uint32)kmalloc(size, GFP_ATOMIC)))); } struct qos_mark2prio_s { int en; u32 mark; u32 mask; int prio; // 0-5 }; void sw_qos_mark2prio_set_enable(int en); void sw_qos_mark2prio_get_enable(int *en); int sw_qos_add_mark2prio(u32 mark, u32 mask, int prio); int sw_qos_del_mark2prio(int index); int sw_qos_get_mark2prio(int index, struct qos_mark2prio_s *m); #endif /* _SWNIC_H */