@@ -114,57 +114,51 @@ static int qlcnic_validate_beacon(struct qlcnic_adapter *adapter, u16 beacon,
114
114
return 0 ;
115
115
}
116
116
117
- static ssize_t qlcnic_store_beacon (struct device * dev ,
118
- struct device_attribute * attr ,
119
- const char * buf , size_t len )
117
+ static int qlcnic_83xx_store_beacon (struct qlcnic_adapter * adapter ,
118
+ const char * buf , size_t len )
120
119
{
121
- struct qlcnic_adapter * adapter = dev_get_drvdata (dev );
122
120
struct qlcnic_hardware_context * ahw = adapter -> ahw ;
123
- int err , max_sds_rings = adapter -> max_sds_rings ;
124
- u16 beacon ;
125
- u8 b_state , b_rate ;
126
121
unsigned long h_beacon ;
122
+ int err ;
127
123
128
- if (adapter -> ahw -> op_mode == QLCNIC_NON_PRIV_FUNC ) {
129
- dev_warn (dev ,
130
- "LED test not supported in non privileged mode\n" );
131
- return - EOPNOTSUPP ;
132
- }
124
+ if (test_bit (__QLCNIC_RESETTING , & adapter -> state ))
125
+ return - EIO ;
133
126
134
- if (qlcnic_83xx_check (adapter ) &&
135
- !test_bit (__QLCNIC_RESETTING , & adapter -> state )) {
136
- if (kstrtoul (buf , 2 , & h_beacon ))
137
- return - EINVAL ;
127
+ if (kstrtoul (buf , 2 , & h_beacon ))
128
+ return - EINVAL ;
138
129
139
- if (ahw -> beacon_state == h_beacon )
140
- return len ;
130
+ if (ahw -> beacon_state == h_beacon )
131
+ return len ;
141
132
142
- rtnl_lock ();
143
- if (!ahw -> beacon_state ) {
144
- if (test_and_set_bit (__QLCNIC_LED_ENABLE ,
145
- & adapter -> state )) {
146
- rtnl_unlock ();
147
- return - EBUSY ;
148
- }
149
- }
150
- if (h_beacon ) {
151
- err = qlcnic_83xx_config_led (adapter , 1 , h_beacon );
152
- if (err )
153
- goto beacon_err ;
154
- } else {
155
- err = qlcnic_83xx_config_led (adapter , 0 , !h_beacon );
156
- if (err )
157
- goto beacon_err ;
133
+ rtnl_lock ();
134
+ if (!ahw -> beacon_state ) {
135
+ if (test_and_set_bit (__QLCNIC_LED_ENABLE , & adapter -> state )) {
136
+ rtnl_unlock ();
137
+ return - EBUSY ;
158
138
}
159
- /* set the current beacon state */
139
+ }
140
+
141
+ if (h_beacon )
142
+ err = qlcnic_83xx_config_led (adapter , 1 , h_beacon );
143
+ else
144
+ err = qlcnic_83xx_config_led (adapter , 0 , !h_beacon );
145
+ if (!err )
160
146
ahw -> beacon_state = h_beacon ;
161
- beacon_err :
162
- if (!ahw -> beacon_state )
163
- clear_bit (__QLCNIC_LED_ENABLE , & adapter -> state );
164
147
165
- rtnl_unlock ();
166
- return len ;
167
- }
148
+ if (!ahw -> beacon_state )
149
+ clear_bit (__QLCNIC_LED_ENABLE , & adapter -> state );
150
+
151
+ rtnl_unlock ();
152
+ return len ;
153
+ }
154
+
155
+ static int qlcnic_82xx_store_beacon (struct qlcnic_adapter * adapter ,
156
+ const char * buf , size_t len )
157
+ {
158
+ struct qlcnic_hardware_context * ahw = adapter -> ahw ;
159
+ int err , max_sds_rings = adapter -> max_sds_rings ;
160
+ u16 beacon ;
161
+ u8 h_beacon_state , b_state , b_rate ;
168
162
169
163
if (len != sizeof (u16 ))
170
164
return QL_STATUS_INVALID_PARAM ;
@@ -174,16 +168,29 @@ static ssize_t qlcnic_store_beacon(struct device *dev,
174
168
if (err )
175
169
return err ;
176
170
177
- if (adapter -> ahw -> beacon_state == b_state )
171
+ if ((ahw -> capabilities2 & QLCNIC_FW_CAPABILITY_2_BEACON )) {
172
+ err = qlcnic_get_beacon_state (adapter , & h_beacon_state );
173
+ if (!err ) {
174
+ dev_info (& adapter -> pdev -> dev ,
175
+ "Failed to get current beacon state\n" );
176
+ } else {
177
+ if (h_beacon_state == QLCNIC_BEACON_DISABLE )
178
+ ahw -> beacon_state = 0 ;
179
+ else if (h_beacon_state == QLCNIC_BEACON_EANBLE )
180
+ ahw -> beacon_state = 2 ;
181
+ }
182
+ }
183
+
184
+ if (ahw -> beacon_state == b_state )
178
185
return len ;
179
186
180
187
rtnl_lock ();
181
-
182
- if (!adapter -> ahw -> beacon_state )
188
+ if (!ahw -> beacon_state ) {
183
189
if (test_and_set_bit (__QLCNIC_LED_ENABLE , & adapter -> state )) {
184
190
rtnl_unlock ();
185
191
return - EBUSY ;
186
192
}
193
+ }
187
194
188
195
if (test_bit (__QLCNIC_RESETTING , & adapter -> state )) {
189
196
err = - EIO ;
@@ -206,14 +213,37 @@ static ssize_t qlcnic_store_beacon(struct device *dev,
206
213
if (test_and_clear_bit (__QLCNIC_DIAG_RES_ALLOC , & adapter -> state ))
207
214
qlcnic_diag_free_res (adapter -> netdev , max_sds_rings );
208
215
209
- out :
210
- if (!adapter -> ahw -> beacon_state )
216
+ out :
217
+ if (!ahw -> beacon_state )
211
218
clear_bit (__QLCNIC_LED_ENABLE , & adapter -> state );
212
219
rtnl_unlock ();
213
220
214
221
return err ;
215
222
}
216
223
224
+ static ssize_t qlcnic_store_beacon (struct device * dev ,
225
+ struct device_attribute * attr ,
226
+ const char * buf , size_t len )
227
+ {
228
+ struct qlcnic_adapter * adapter = dev_get_drvdata (dev );
229
+ int err = 0 ;
230
+
231
+ if (adapter -> ahw -> op_mode == QLCNIC_NON_PRIV_FUNC ) {
232
+ dev_warn (dev ,
233
+ "LED test not supported in non privileged mode\n" );
234
+ return - EOPNOTSUPP ;
235
+ }
236
+
237
+ if (qlcnic_82xx_check (adapter ))
238
+ err = qlcnic_82xx_store_beacon (adapter , buf , len );
239
+ else if (qlcnic_83xx_check (adapter ))
240
+ err = qlcnic_83xx_store_beacon (adapter , buf , len );
241
+ else
242
+ return - EIO ;
243
+
244
+ return err ;
245
+ }
246
+
217
247
static ssize_t qlcnic_show_beacon (struct device * dev ,
218
248
struct device_attribute * attr , char * buf )
219
249
{
0 commit comments