@@ -40,6 +40,69 @@ static inline __le64 build_ctob(u32 td_cmd, u32 td_offset, unsigned int size,
4040}
4141
4242#define I40E_TXD_CMD (I40E_TX_DESC_CMD_EOP | I40E_TX_DESC_CMD_RS)
43+ /**
44+ * i40e_fdir - Generate a Flow Director descriptor based on fdata
45+ * @tx_ring: Tx ring to send buffer on
46+ * @fdata: Flow director filter data
47+ * @add: Indicate if we are adding a rule or deleting one
48+ *
49+ **/
50+ static void i40e_fdir (struct i40e_ring * tx_ring ,
51+ struct i40e_fdir_filter * fdata , bool add )
52+ {
53+ struct i40e_filter_program_desc * fdir_desc ;
54+ struct i40e_pf * pf = tx_ring -> vsi -> back ;
55+ u32 flex_ptype , dtype_cmd ;
56+ u16 i ;
57+
58+ /* grab the next descriptor */
59+ i = tx_ring -> next_to_use ;
60+ fdir_desc = I40E_TX_FDIRDESC (tx_ring , i );
61+
62+ i ++ ;
63+ tx_ring -> next_to_use = (i < tx_ring -> count ) ? i : 0 ;
64+
65+ flex_ptype = I40E_TXD_FLTR_QW0_QINDEX_MASK &
66+ (fdata -> q_index << I40E_TXD_FLTR_QW0_QINDEX_SHIFT );
67+
68+ flex_ptype |= I40E_TXD_FLTR_QW0_FLEXOFF_MASK &
69+ (fdata -> flex_off << I40E_TXD_FLTR_QW0_FLEXOFF_SHIFT );
70+
71+ flex_ptype |= I40E_TXD_FLTR_QW0_PCTYPE_MASK &
72+ (fdata -> pctype << I40E_TXD_FLTR_QW0_PCTYPE_SHIFT );
73+
74+ /* Use LAN VSI Id if not programmed by user */
75+ flex_ptype |= I40E_TXD_FLTR_QW0_DEST_VSI_MASK &
76+ ((u32 )(fdata -> dest_vsi ? : pf -> vsi [pf -> lan_vsi ]-> id ) <<
77+ I40E_TXD_FLTR_QW0_DEST_VSI_SHIFT );
78+
79+ dtype_cmd = I40E_TX_DESC_DTYPE_FILTER_PROG ;
80+
81+ dtype_cmd |= add ?
82+ I40E_FILTER_PROGRAM_DESC_PCMD_ADD_UPDATE <<
83+ I40E_TXD_FLTR_QW1_PCMD_SHIFT :
84+ I40E_FILTER_PROGRAM_DESC_PCMD_REMOVE <<
85+ I40E_TXD_FLTR_QW1_PCMD_SHIFT ;
86+
87+ dtype_cmd |= I40E_TXD_FLTR_QW1_DEST_MASK &
88+ (fdata -> dest_ctl << I40E_TXD_FLTR_QW1_DEST_SHIFT );
89+
90+ dtype_cmd |= I40E_TXD_FLTR_QW1_FD_STATUS_MASK &
91+ (fdata -> fd_status << I40E_TXD_FLTR_QW1_FD_STATUS_SHIFT );
92+
93+ if (fdata -> cnt_index ) {
94+ dtype_cmd |= I40E_TXD_FLTR_QW1_CNT_ENA_MASK ;
95+ dtype_cmd |= I40E_TXD_FLTR_QW1_CNTINDEX_MASK &
96+ ((u32 )fdata -> cnt_index <<
97+ I40E_TXD_FLTR_QW1_CNTINDEX_SHIFT );
98+ }
99+
100+ fdir_desc -> qindex_flex_ptype_vsi = cpu_to_le32 (flex_ptype );
101+ fdir_desc -> rsvd = cpu_to_le32 (0 );
102+ fdir_desc -> dtype_cmd_cntindex = cpu_to_le32 (dtype_cmd );
103+ fdir_desc -> fd_id = cpu_to_le32 (fdata -> fd_id );
104+ }
105+
43106#define I40E_FD_CLEAN_DELAY 10
44107/**
45108 * i40e_program_fdir_filter - Program a Flow Director filter
@@ -51,11 +114,9 @@ static inline __le64 build_ctob(u32 td_cmd, u32 td_offset, unsigned int size,
51114int i40e_program_fdir_filter (struct i40e_fdir_filter * fdir_data , u8 * raw_packet ,
52115 struct i40e_pf * pf , bool add )
53116{
54- struct i40e_filter_program_desc * fdir_desc ;
55117 struct i40e_tx_buffer * tx_buf , * first ;
56118 struct i40e_tx_desc * tx_desc ;
57119 struct i40e_ring * tx_ring ;
58- unsigned int fpt , dcc ;
59120 struct i40e_vsi * vsi ;
60121 struct device * dev ;
61122 dma_addr_t dma ;
@@ -92,56 +153,8 @@ int i40e_program_fdir_filter(struct i40e_fdir_filter *fdir_data, u8 *raw_packet,
92153
93154 /* grab the next descriptor */
94155 i = tx_ring -> next_to_use ;
95- fdir_desc = I40E_TX_FDIRDESC (tx_ring , i );
96156 first = & tx_ring -> tx_bi [i ];
97- memset (first , 0 , sizeof (struct i40e_tx_buffer ));
98-
99- tx_ring -> next_to_use = ((i + 1 ) < tx_ring -> count ) ? i + 1 : 0 ;
100-
101- fpt = (fdir_data -> q_index << I40E_TXD_FLTR_QW0_QINDEX_SHIFT ) &
102- I40E_TXD_FLTR_QW0_QINDEX_MASK ;
103-
104- fpt |= (fdir_data -> flex_off << I40E_TXD_FLTR_QW0_FLEXOFF_SHIFT ) &
105- I40E_TXD_FLTR_QW0_FLEXOFF_MASK ;
106-
107- fpt |= (fdir_data -> pctype << I40E_TXD_FLTR_QW0_PCTYPE_SHIFT ) &
108- I40E_TXD_FLTR_QW0_PCTYPE_MASK ;
109-
110- /* Use LAN VSI Id if not programmed by user */
111- if (fdir_data -> dest_vsi == 0 )
112- fpt |= (pf -> vsi [pf -> lan_vsi ]-> id ) <<
113- I40E_TXD_FLTR_QW0_DEST_VSI_SHIFT ;
114- else
115- fpt |= ((u32 )fdir_data -> dest_vsi <<
116- I40E_TXD_FLTR_QW0_DEST_VSI_SHIFT ) &
117- I40E_TXD_FLTR_QW0_DEST_VSI_MASK ;
118-
119- dcc = I40E_TX_DESC_DTYPE_FILTER_PROG ;
120-
121- if (add )
122- dcc |= I40E_FILTER_PROGRAM_DESC_PCMD_ADD_UPDATE <<
123- I40E_TXD_FLTR_QW1_PCMD_SHIFT ;
124- else
125- dcc |= I40E_FILTER_PROGRAM_DESC_PCMD_REMOVE <<
126- I40E_TXD_FLTR_QW1_PCMD_SHIFT ;
127-
128- dcc |= (fdir_data -> dest_ctl << I40E_TXD_FLTR_QW1_DEST_SHIFT ) &
129- I40E_TXD_FLTR_QW1_DEST_MASK ;
130-
131- dcc |= (fdir_data -> fd_status << I40E_TXD_FLTR_QW1_FD_STATUS_SHIFT ) &
132- I40E_TXD_FLTR_QW1_FD_STATUS_MASK ;
133-
134- if (fdir_data -> cnt_index != 0 ) {
135- dcc |= I40E_TXD_FLTR_QW1_CNT_ENA_MASK ;
136- dcc |= ((u32 )fdir_data -> cnt_index <<
137- I40E_TXD_FLTR_QW1_CNTINDEX_SHIFT ) &
138- I40E_TXD_FLTR_QW1_CNTINDEX_MASK ;
139- }
140-
141- fdir_desc -> qindex_flex_ptype_vsi = cpu_to_le32 (fpt );
142- fdir_desc -> rsvd = cpu_to_le32 (0 );
143- fdir_desc -> dtype_cmd_cntindex = cpu_to_le32 (dcc );
144- fdir_desc -> fd_id = cpu_to_le32 (fdir_data -> fd_id );
157+ i40e_fdir (tx_ring , fdir_data , add );
145158
146159 /* Now program a dummy descriptor */
147160 i = tx_ring -> next_to_use ;
0 commit comments