@@ -96,14 +96,16 @@ static const struct i2c_device_id as4630_54pe_cpld_id[] = {
96
96
};
97
97
MODULE_DEVICE_TABLE (i2c , as4630_54pe_cpld_id );
98
98
99
- #define TRANSCEIVER_PRESENT_ATTR_ID (index ) MODULE_PRESENT_##index
99
+ #define TRANSCEIVER_RESET_ATTR_ID (index ) MODULE_RESET_##index
100
+ #define TRANSCEIVER_LPMODE_ATTR_ID (index ) MODULE_LPMODE_##index
101
+ #define TRANSCEIVER_PRESENT_ATTR_ID (index ) MODULE_PRESENT_##index
100
102
#define TRANSCEIVER_TXDISABLE_ATTR_ID (index ) MODULE_TXDISABLE_##index
101
- #define TRANSCEIVER_RXLOS_ATTR_ID (index ) MODULE_RXLOS_##index
102
- #define TRANSCEIVER_TXFAULT_ATTR_ID (index ) MODULE_TXFAULT_##index
103
+ #define TRANSCEIVER_RXLOS_ATTR_ID (index ) MODULE_RXLOS_##index
104
+ #define TRANSCEIVER_TXFAULT_ATTR_ID (index ) MODULE_TXFAULT_##index
103
105
#define FAN_SPEED_RPM_ATTR_ID (index ) FAN_SPEED_RPM_##index
104
- #define FAN_DIRECTION_ID (index ) FAN_DIRECTION_##index
106
+ #define FAN_DIRECTION_ID (index ) FAN_DIRECTION_##index
105
107
#define FAN_PRESENT_ATTR_ID (index ) FAN_PRESENT_##index
106
- #define FAN_FAULT_ATTR_ID (index ) FAN_FAULT_##index
108
+ #define FAN_FAULT_ATTR_ID (index ) FAN_FAULT_##index
107
109
108
110
enum as4630_54pe_cpld_sysfs_attributes {
109
111
CPLD_VERSION ,
@@ -123,6 +125,10 @@ enum as4630_54pe_cpld_sysfs_attributes {
123
125
TRANSCEIVER_PRESENT_ATTR_ID (52 ),
124
126
TRANSCEIVER_PRESENT_ATTR_ID (53 ),
125
127
TRANSCEIVER_PRESENT_ATTR_ID (54 ),
128
+ TRANSCEIVER_RESET_ATTR_ID (53 ),
129
+ TRANSCEIVER_RESET_ATTR_ID (54 ),
130
+ TRANSCEIVER_LPMODE_ATTR_ID (53 ),
131
+ TRANSCEIVER_LPMODE_ATTR_ID (54 ),
126
132
TRANSCEIVER_TXDISABLE_ATTR_ID (49 ),
127
133
TRANSCEIVER_TXDISABLE_ATTR_ID (50 ),
128
134
TRANSCEIVER_TXDISABLE_ATTR_ID (51 ),
@@ -148,6 +154,8 @@ static ssize_t show_status(struct device *dev, struct device_attribute *da,
148
154
char * buf );
149
155
static ssize_t set_tx_disable (struct device * dev , struct device_attribute * da ,
150
156
const char * buf , size_t count );
157
+ static ssize_t set_qsfp (struct device * dev , struct device_attribute * da ,
158
+ const char * buf , size_t count );
151
159
static ssize_t access (struct device * dev , struct device_attribute * da ,
152
160
const char * buf , size_t count );
153
161
static ssize_t show_version (struct device * dev , struct device_attribute * da ,
@@ -161,10 +169,6 @@ static ssize_t fan_show_value(struct device *dev, struct device_attribute *da, c
161
169
static ssize_t set_duty_cycle (struct device * dev , struct device_attribute * da ,
162
170
const char * buf , size_t count );
163
171
static ssize_t get_sys_temp (struct device * dev , struct device_attribute * da , char * buf );
164
- //static ssize_t show_power(struct device *dev, struct device_attribute *da,
165
- // char *buf);
166
-
167
-
168
172
169
173
/* transceiver attributes */
170
174
#define DECLARE_SFP_TRANSCEIVER_SENSOR_DEVICE_ATTR (index ) \
@@ -178,11 +182,15 @@ static ssize_t get_sys_temp(struct device *dev, struct device_attribute *da, cha
178
182
&sensor_dev_attr_module_tx_disable_##index.dev_attr.attr, \
179
183
&sensor_dev_attr_module_rx_los_##index.dev_attr.attr, \
180
184
&sensor_dev_attr_module_tx_fault_##index.dev_attr.attr
181
-
185
+
182
186
#define DECLARE_QSFP_TRANSCEIVER_SENSOR_DEVICE_ATTR (index ) \
187
+ static SENSOR_DEVICE_ATTR(module_lpmode_##index, S_IRUGO | S_IWUSR, show_status, set_qsfp, MODULE_LPMODE_##index); \
188
+ static SENSOR_DEVICE_ATTR(module_reset_##index, S_IRUGO | S_IWUSR, show_status, set_qsfp, MODULE_RESET_##index); \
183
189
static SENSOR_DEVICE_ATTR(module_present_##index, S_IRUGO, show_status, NULL, MODULE_PRESENT_##index);
184
190
185
191
#define DECLARE_QSFP_TRANSCEIVER_ATTR (index ) \
192
+ &sensor_dev_attr_module_lpmode_##index.dev_attr.attr, \
193
+ &sensor_dev_attr_module_reset_##index.dev_attr.attr, \
186
194
&sensor_dev_attr_module_present_##index.dev_attr.attr
187
195
188
196
@@ -273,7 +281,7 @@ static ssize_t show_status(struct device *dev, struct device_attribute *da,
273
281
break ;
274
282
case MODULE_TXDISABLE_49 ... MODULE_TXDISABLE_50 :
275
283
reg = 0x5 ;
276
- mask = 0x1 << (attr -> index == MODULE_TXFAULT_49 ?7 :3 );
284
+ mask = 0x1 << (attr -> index == MODULE_TXDISABLE_49 ?7 :3 );
277
285
break ;
278
286
279
287
case MODULE_RXLOS_51 ... MODULE_RXLOS_52 :
@@ -290,12 +298,22 @@ static ssize_t show_status(struct device *dev, struct device_attribute *da,
290
298
break ;
291
299
case MODULE_TXDISABLE_51 ... MODULE_TXDISABLE_52 :
292
300
reg = 0x6 ;
293
- mask = 0x1 << (attr -> index == MODULE_TXFAULT_51 ?7 :3 );
301
+ mask = 0x1 << (attr -> index == MODULE_TXDISABLE_51 ?7 :3 );
294
302
break ;
295
303
case MODULE_PRESENT_53 ... MODULE_PRESENT_54 :
296
304
reg = 0x21 ;
297
305
mask = 0x1 << (attr -> index == MODULE_PRESENT_53 ?0 :4 );
298
306
break ;
307
+ case MODULE_RESET_53 ... MODULE_RESET_54 :
308
+ reg = 0x21 ;
309
+ mask = 0x1 << (attr -> index == MODULE_RESET_53 ?3 :7 );
310
+ revert = 1 ;
311
+ break ;
312
+ case MODULE_LPMODE_53 ... MODULE_LPMODE_54 :
313
+ reg = 0x21 ;
314
+ mask = 0x1 << (attr -> index == MODULE_LPMODE_53 ?2 :6 );
315
+ revert = 0 ;
316
+ break ;
299
317
default :
300
318
return 0 ;
301
319
}
@@ -319,6 +337,61 @@ static ssize_t show_status(struct device *dev, struct device_attribute *da,
319
337
return status ;
320
338
}
321
339
340
+ static ssize_t set_qsfp (struct device * dev , struct device_attribute * da ,
341
+ const char * buf , size_t count )
342
+ {
343
+ struct sensor_device_attribute * attr = to_sensor_dev_attr (da );
344
+ struct i2c_client * client = to_i2c_client (dev );
345
+ struct as4630_54pe_cpld_data * data = i2c_get_clientdata (client );
346
+ long disable ;
347
+ int status ;
348
+ u8 reg = 0 , mask = 0 , revert = 0 ;
349
+
350
+ status = kstrtol (buf , 10 , & disable );
351
+ if (status ) {
352
+ return status ;
353
+ }
354
+ reg = 0x21 ;
355
+ switch (attr -> index )
356
+ {
357
+ case MODULE_RESET_53 ... MODULE_RESET_54 :
358
+ mask = 0x1 << (attr -> index == MODULE_RESET_53 ?3 :7 );
359
+ revert = 1 ;
360
+ break ;
361
+ case MODULE_LPMODE_53 ... MODULE_LPMODE_54 :
362
+ mask = 0x1 << (attr -> index == MODULE_LPMODE_53 ?2 :6 );
363
+ revert = 0 ;
364
+ break ;
365
+ default :
366
+ return 0 ;
367
+ }
368
+
369
+ disable = revert ? disable : !disable ;
370
+ /* Read current status */
371
+ mutex_lock (& data -> update_lock );
372
+ status = as4630_54pe_cpld_read_internal (client , reg );
373
+ if (unlikely (status < 0 )) {
374
+ goto exit ;
375
+ }
376
+ if (disable ) {
377
+ status &= ~mask ;
378
+ }
379
+ else {
380
+ status |= mask ;
381
+ }
382
+ status = as4630_54pe_cpld_write_internal (client , reg , status );
383
+ if (unlikely (status < 0 )) {
384
+ goto exit ;
385
+ }
386
+
387
+ mutex_unlock (& data -> update_lock );
388
+ return count ;
389
+
390
+ exit :
391
+ mutex_unlock (& data -> update_lock );
392
+ return status ;
393
+ }
394
+
322
395
static ssize_t set_tx_disable (struct device * dev , struct device_attribute * da ,
323
396
const char * buf , size_t count )
324
397
{
@@ -338,11 +411,11 @@ static ssize_t set_tx_disable(struct device *dev, struct device_attribute *da,
338
411
{
339
412
case MODULE_TXDISABLE_49 ... MODULE_TXDISABLE_50 :
340
413
reg = 0x5 ;
341
- mask = 0x1 << (attr -> index == MODULE_TXFAULT_49 ?7 :3 );
414
+ mask = 0x1 << (attr -> index == MODULE_TXDISABLE_49 ?7 :3 );
342
415
break ;
343
416
case MODULE_TXDISABLE_51 ... MODULE_TXDISABLE_52 :
344
417
reg = 0x6 ;
345
- mask = 0x1 << (attr -> index == MODULE_TXFAULT_51 ?7 :3 );
418
+ mask = 0x1 << (attr -> index == MODULE_TXDISABLE_51 ?7 :3 );
346
419
break ;
347
420
348
421
default :
@@ -357,10 +430,10 @@ static ssize_t set_tx_disable(struct device *dev, struct device_attribute *da,
357
430
}
358
431
/* Update tx_disable status */
359
432
if (disable ) {
360
- status &= ~ mask ;
433
+ status |= mask ;
361
434
}
362
435
else {
363
- status |= mask ;
436
+ status &= ~ mask ;
364
437
}
365
438
status = as4630_54pe_cpld_write_internal (client , reg , status );
366
439
if (unlikely (status < 0 )) {
0 commit comments