2323#include <linux/module.h>
2424#include <linux/init.h>
2525#include <linux/hwmon-sysfs.h>
26- #include "pddf_led_defs.h"
27- #include "pddf_client_defs.h"
2826#include <linux/err.h>
2927#include <linux/mutex.h>
3028#include <linux/slab.h>
29+ #include "pddf_client_defs.h"
30+ #include "pddf_led_defs.h"
31+ #include "pddf_multifpgapci_defs.h"
3132
3233#define DEBUG 0
3334#define MAX_PSU_NUM 2
3435#define MAX_FANTRAY_NUM 6
36+ #define MAX_PORT_NUM (48 * 8)
3537LED_OPS_DATA sys_led_ops_data [1 ]= {0 };
3638LED_OPS_DATA psu_led_ops_data [MAX_PSU_NUM ]= {0 };
3739LED_OPS_DATA diag_led_ops_data [1 ]= {0 };
3840LED_OPS_DATA fan_led_ops_data [1 ]= {0 };
3941LED_OPS_DATA loc_led_ops_data [1 ]= {0 };
4042LED_OPS_DATA bmc_led_ops_data [1 ]= {0 };
4143LED_OPS_DATA fantray_led_ops_data [MAX_FANTRAY_NUM ]= {0 };
44+ LED_OPS_DATA port_led_ops_data [MAX_PORT_NUM ] = {0 };
4245LED_OPS_DATA temp_data = {0 };
4346LED_OPS_DATA * dev_list [LED_TYPE_MAX ] = {
4447 sys_led_ops_data ,
@@ -48,6 +51,7 @@ LED_OPS_DATA* dev_list[LED_TYPE_MAX] = {
4851 diag_led_ops_data ,
4952 loc_led_ops_data ,
5053 bmc_led_ops_data ,
54+ port_led_ops_data ,
5155 NULL
5256};
5357int num_psus = 0 ;
@@ -63,6 +67,8 @@ extern ssize_t store_pddf_data(struct device *dev, struct device_attribute *da,
6367extern ssize_t show_pddf_s3ip_data (struct device * dev , struct device_attribute * da , char * buf );
6468extern ssize_t store_pddf_s3ip_data (struct device * dev , struct device_attribute * da , const char * buf , size_t count );
6569
70+ extern void * get_device_table (char * name );
71+
6672static LED_STATUS find_state_index (const char * state_str ) {
6773 int index ;
6874 char * ptr = (char * )state_str ;
@@ -91,6 +97,8 @@ static LED_TYPE get_dev_type(char* name)
9197 ret = LED_LOC ;
9298 } else if (strstr (name , "FANTRAY_LED" )) {
9399 ret = LED_FANTRAY ;
100+ } else if (strstr (name , "PORT_LED" )) {
101+ ret = LED_PORT ;
94102 }
95103#if DEBUG > 1
96104 pddf_dbg (LED , KERN_INFO "LED get_dev_type: %s; %d\n" , name , ret );
@@ -111,6 +119,9 @@ static int dev_index_check(LED_TYPE type, int index)
111119 case LED_FANTRAY :
112120 if (index >= MAX_FANTRAY_NUM ) return (-1 );
113121 break ;
122+ case LED_PORT :
123+ if (index >= MAX_PORT_NUM ) return (-1 );
124+ break ;
114125 default :
115126 if (index >= 1 ) return (-1 );
116127 break ;
@@ -160,6 +171,42 @@ static void print_led_data(LED_OPS_DATA *ptr, LED_STATUS state)
160171 }
161172}
162173
174+ int led_multifpgapci_read (LED_OPS_DATA * ops_ptr , uint32_t * output ) {
175+ struct pci_dev * pci_dev = NULL ;
176+
177+ if (ptr_multifpgapci_readpci == NULL ) {
178+ printk (KERN_ERR "PDDF_LED: pddf_multifpgapci_module is not loaded" );
179+ return -1 ;
180+ }
181+
182+ pci_dev = (struct pci_dev * )get_device_table (ops_ptr -> attr_devname );
183+ if (pci_dev == NULL ) {
184+ printk (KERN_ERR "PDDF_LED: Unable to get pci_dev of %s for %s\n" ,
185+ ops_ptr -> attr_devname , ops_ptr -> device_name );
186+ return -1 ;
187+ }
188+ return ptr_multifpgapci_readpci (
189+ pci_dev , ops_ptr -> swpld_addr + ops_ptr -> swpld_addr_offset , output );
190+ }
191+
192+ int led_multifpgapci_write (LED_OPS_DATA * ops_ptr , uint32_t val ) {
193+ struct pci_dev * pci_dev = NULL ;
194+
195+ if (ptr_multifpgapci_readpci == NULL || ptr_multifpgapci_writepci == NULL ) {
196+ printk (KERN_ERR "PDDF_LED: pddf_multifpgapci_module is not loaded" );
197+ return -1 ;
198+ }
199+
200+ pci_dev = (struct pci_dev * )get_device_table (ops_ptr -> attr_devname );
201+ if (pci_dev == NULL ) {
202+ printk (KERN_ERR "PDDF_LED: Unable to get pci_dev of %s for %s\n" ,
203+ ops_ptr -> attr_devname , ops_ptr -> device_name );
204+ return -1 ;
205+ }
206+ return ptr_multifpgapci_writepci (
207+ pci_dev , val , ops_ptr -> swpld_addr + ops_ptr -> swpld_addr_offset );
208+ }
209+
163210ssize_t get_status_led (struct device_attribute * da )
164211{
165212 int ret = 0 ;
@@ -185,35 +232,51 @@ ssize_t get_status_led(struct device_attribute *da)
185232 if (strcmp (ops_ptr -> attr_devtype , "cpld" ) == 0 ) {
186233 cpld_type = 1 ;
187234 sys_val = board_i2c_cpld_read (ops_ptr -> swpld_addr , ops_ptr -> swpld_addr_offset );
235+ if (sys_val < 0 ) {
236+ pddf_dbg (LED , KERN_ERR "ERROR %s: %s %d devtype:%s 0x%x:0x%x read failed\n" ,__func__ ,
237+ ops_ptr -> device_name , ops_ptr -> index , ops_ptr -> attr_devtype , ops_ptr -> swpld_addr , ops_ptr -> swpld_addr_offset );
238+ return sys_val ;
239+ }
188240 } else if (strcmp (ops_ptr -> attr_devtype , "fpgai2c" ) == 0 ) {
189241 sys_val = board_i2c_fpga_read (ops_ptr -> swpld_addr , ops_ptr -> swpld_addr_offset );
242+ if (sys_val < 0 ) {
243+ pddf_dbg (LED , KERN_ERR "ERROR %s: %s %d devtype:%s 0x%x:0x%x read failed\n" ,__func__ ,
244+ ops_ptr -> device_name , ops_ptr -> index , ops_ptr -> attr_devtype , ops_ptr -> swpld_addr , ops_ptr -> swpld_addr_offset );
245+ return sys_val ;
246+ }
247+ } else if (strcmp (ops_ptr -> attr_devtype , "multifpgapci" ) == 0 ) {
248+ ret = led_multifpgapci_read (ops_ptr , & sys_val );
249+ if (ret )
250+ goto ret ;
190251 } else {
191252 pddf_dbg (LED , KERN_ERR "ERROR %s: %s %d devtype:%s 0x%x:0x%x not configured\n" ,__func__ ,
192253 ops_ptr -> device_name , ops_ptr -> index , ops_ptr -> attr_devtype , ops_ptr -> swpld_addr , ops_ptr -> swpld_addr_offset );
193254 return (-1 );
194255 }
195256
196- if (sys_val < 0 ) {
197- pddf_dbg (LED , KERN_ERR "ERROR %s: %s %d devtype:%s 0x%x:0x%x read failed\n" ,__func__ ,
198- ops_ptr -> device_name , ops_ptr -> index , ops_ptr -> attr_devtype , ops_ptr -> swpld_addr , ops_ptr -> swpld_addr_offset );
199- return sys_val ;
200- }
201-
202257 strcpy (temp_data .cur_state .color , "None" );
203258 for (state = 0 ; state < MAX_LED_STATUS ; state ++ ) {
204259 color_val = (sys_val & ~ops_ptr -> data [state ].bits .mask_bits );
205260 for (j = 0 ; j < VALUE_SIZE && ops_ptr -> data [state ].reg_values [j ] != 0xff ; j ++ ) {
206261 if ((color_val ^ (ops_ptr -> data [state ].reg_values [j ] << ops_ptr -> data [state ].bits .pos )) == 0 ) {
207262 strcpy (temp_data .cur_state .color , LED_STATUS_STR [state ]);
208- break ;
263+ goto found_match ;
209264 }
210265 }
211266 }
267+
268+ found_match :
212269#if DEBUG
213270 pddf_dbg (LED , KERN_ERR "Get : %s:%d addr/offset:0x%x; 0x%x devtype:%s;%s value=0x%x [%s]\n" ,
214271 ops_ptr -> device_name , ops_ptr -> index , ops_ptr -> swpld_addr , ops_ptr -> swpld_addr_offset ,
215272 ops_ptr -> attr_devtype , cpld_type ? "cpld" : "fpgai2c" , sys_val , temp_data .cur_state .color );
216273#endif
274+
275+ ret :
276+ if (ret ) {
277+ printk (KERN_ERR "%s: Error status = %d" , __FUNCTION__ , ret );
278+ }
279+
217280 return (ret );
218281}
219282
@@ -253,17 +316,22 @@ ssize_t set_status_led(struct device_attribute *da)
253316 if (strcmp (ops_ptr -> data [cur_state ].attr_devtype , "cpld" ) == 0 ) {
254317 cpld_type = 1 ;
255318 sys_val = board_i2c_cpld_read (ops_ptr -> swpld_addr , ops_ptr -> swpld_addr_offset );
319+ if (sys_val < 0 )
320+ return sys_val ;
256321 } else if (strcmp (ops_ptr -> data [cur_state ].attr_devtype , "fpgai2c" ) == 0 ) {
257322 sys_val = board_i2c_fpga_read (ops_ptr -> swpld_addr , ops_ptr -> swpld_addr_offset );
323+ if (sys_val < 0 )
324+ return sys_val ;
325+ } else if (strcmp (ops_ptr -> attr_devtype , "multifpgapci" ) == 0 ) {
326+ ret = led_multifpgapci_read (ops_ptr , & sys_val );
327+ if (ret )
328+ goto ret ;
258329 } else {
259330 pddf_dbg (LED , KERN_ERR "ERROR %s: %s %d devtype:%s not configured\n" ,__func__ ,
260331 ops_ptr -> device_name , ops_ptr -> index , ops_ptr -> attr_devtype );
261332 return (-1 );
262333 }
263334
264- if (sys_val < 0 )
265- return sys_val ;
266-
267335 new_val = (sys_val & ops_ptr -> data [cur_state ].bits .mask_bits ) |
268336 (ops_ptr -> data [cur_state ].reg_values [0 ] << ops_ptr -> data [cur_state ].bits .pos );
269337
@@ -279,6 +347,13 @@ ssize_t set_status_led(struct device_attribute *da)
279347 } else if (strcmp (ops_ptr -> data [cur_state ].attr_devtype , "fpgai2c" ) == 0 ) {
280348 ret = board_i2c_fpga_write (ops_ptr -> swpld_addr , ops_ptr -> swpld_addr_offset , (uint8_t )new_val );
281349 read_val = board_i2c_fpga_read (ops_ptr -> swpld_addr , ops_ptr -> swpld_addr_offset );
350+ } else if (strcmp (ops_ptr -> attr_devtype , "multifpgapci" ) == 0 ) {
351+ ret = led_multifpgapci_write (ops_ptr , new_val );
352+ if (ret )
353+ goto ret ;
354+ ret = led_multifpgapci_read (ops_ptr , & read_val );
355+ if (ret )
356+ goto ret ;
282357 } else {
283358 pddf_dbg (LED , KERN_ERR "ERROR %s: %s %d devtype:%s not configured\n" ,__func__ ,
284359 ops_ptr -> device_name , ops_ptr -> index , ops_ptr -> attr_devtype );
@@ -291,6 +366,11 @@ ssize_t set_status_led(struct device_attribute *da)
291366 cpld_type ? "cpld" :"fpgai2c" , ret , read_val , ops_ptr -> data [cur_state ].attr_devtype );
292367#endif
293368
369+ ret :
370+ if (ret ) {
371+ printk (KERN_ERR "%s: Error status = %d" , __FUNCTION__ , ret );
372+ }
373+
294374 return (ret );
295375}
296376
@@ -634,7 +714,7 @@ ssize_t store_config_data(struct device *dev, struct device_attribute *da, const
634714ssize_t store_bits_data (struct device * dev , struct device_attribute * da , const char * buf , size_t count )
635715{
636716 int len = 0 , num1 = 0 , num2 = 0 , i = 0 , rc1 = 0 , rc2 = 0 ;
637- char mask = 0xFF ;
717+ unsigned int mask = 0xFFFFFFFF ;
638718 char * pptr = NULL ;
639719 char bits [NAME_SIZE ];
640720 struct pddf_data_attribute * ptr = (struct pddf_data_attribute * )da ;
@@ -853,7 +933,6 @@ static int __init led_init(void) {
853933 return (0 );
854934}
855935
856-
857936static void __exit led_exit (void ) {
858937 pddf_dbg (LED , "PDDF GENERIC LED MODULE exit..\n" );
859938 free_kobjs ();
0 commit comments