Skip to content

Commit 8ef5aeb

Browse files
authored
Merge pull request #978 from acctalex/as9817_64_scm_bmc
[Edgecore][as9817-64d][as9817-64o] Fixed spi_busy_reg's pcie addr issue
2 parents d0fcd47 + e9004a4 commit 8ef5aeb

7 files changed

Lines changed: 166 additions & 68 deletions

packages/platforms/accton/x86-64/as9817-64/src/modules/x86-64-accton-as9817-64-fan.c

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include <linux/ipmi.h>
3333
#include <linux/ipmi_smi.h>
3434
#include <linux/platform_device.h>
35+
#include <linux/string_helpers.h>
3536

3637
#define DRVNAME "as9817_64_fan"
3738
#define ACCTON_IPMI_NETFN 0x34
@@ -312,23 +313,41 @@ static int ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd,
312313
{
313314
int status = 0, retry = 0;
314315

316+
char *cmdline = kstrdup_quotable_cmdline(current, GFP_KERNEL);
317+
318+
int i = 0;
319+
char raw_cmd[20] = "";
320+
sprintf(raw_cmd, "0x%02x", cmd);
321+
if(tx_len) {
322+
for(i = 0; i < tx_len; i++)
323+
sprintf(raw_cmd + strlen(raw_cmd), " 0x%02x", tx_data[i]);
324+
}
325+
315326
for (retry = 0; retry <= IPMI_ERR_RETRY_TIMES; retry++) {
316-
status = _ipmi_send_message(ipmi,cmd, tx_data, tx_len, rx_data, rx_len);
327+
status = _ipmi_send_message(ipmi,cmd, tx_data, tx_len, rx_data,
328+
rx_len);
317329
if (unlikely(status != 0)) {
318-
dev_err(&data->pdev->dev, "ipmi_send_message_%d err status(%d)\r\n",
319-
retry, status);
330+
dev_err(&data->pdev->dev,
331+
"ipmi_send_message_%d err status(%d)[%s] raw_cmd=[%s] tx_msgid=(%02x)\r\n",
332+
retry, status, cmdline ? cmdline : "", raw_cmd,
333+
(int)ipmi->tx_msgid);
320334
continue;
321335
}
322336

323337
if (unlikely(ipmi->rx_result != 0)) {
324-
dev_err(&data->pdev->dev, "ipmi_send_message_%d err result(%d)\r\n",
325-
retry, ipmi->rx_result);
338+
dev_err(&data->pdev->dev,
339+
"ipmi_send_message_%d err result(%d)[%s] raw_cmd=[%s] tx_msgid=(%02x)\r\n",
340+
retry, ipmi->rx_result, cmdline ? cmdline : "", raw_cmd,
341+
(int)ipmi->tx_msgid);
326342
continue;
327343
}
328344

329345
break;
330346
}
331347

348+
if (cmdline)
349+
kfree(cmdline);
350+
332351
return status;
333352
}
334353

packages/platforms/accton/x86-64/as9817-64/src/modules/x86-64-accton-as9817-64-fpga.c

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ do { \
130130
* structure & variable declare
131131
* *********************************************/
132132
typedef struct pci_fpga_device_s {
133+
void __iomem *data_base_addr0;
133134
void __iomem *data_base_addr1;
134135
void __iomem *data_base_addr2;
135136
resource_size_t data_region1;
@@ -149,6 +150,7 @@ struct as9817_64_fpga_data {
149150
static struct platform_device *pdev = NULL;
150151
extern spinlock_t cpld_access_lock;
151152
extern int wait_spi(u32 mask, unsigned long timeout);
153+
extern void __iomem *spi_busy_reg;
152154

153155
/***********************************************
154156
* enum define
@@ -595,7 +597,7 @@ static struct attribute_mapping attribute_mappings[] = {
595597
[MODULE_RX_LOS_65 ... MODULE_RX_LOS_66] = {MODULE_RX_LOS_65, SFP_RXLOSS_REG, 0},
596598
};
597599

598-
static inline unsigned int fpga_read(void __iomem *addr, u32 spi_mask)
600+
static inline unsigned int fpga_read(const void __iomem *addr, u32 spi_mask)
599601
{
600602
wait_spi(spi_mask, usecs_to_jiffies(20));
601603
return ioread8(addr);
@@ -714,7 +716,7 @@ static ssize_t status_read(struct device *dev, struct device_attribute *da, char
714716
struct as9817_64_fpga_data *fpga_ctl = dev_get_drvdata(dev);
715717
ssize_t ret = -EINVAL;
716718
u16 reg;
717-
u8 major, minor, reg_val = 0;
719+
u8 major, minor, reg_val;
718720
u8 bits_shift;
719721

720722
switch(attr->index)
@@ -778,12 +780,12 @@ static ssize_t status_write(struct device *dev, struct device_attribute *da,
778780
{
779781
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
780782
struct as9817_64_fpga_data *fpga_ctl = dev_get_drvdata(dev);
781-
void __iomem *addr = 0;
783+
void __iomem *addr;
782784
int status;
783785
u16 reg;
784786
u8 input;
785787
u8 reg_val, bit_mask, should_set_bit;
786-
u32 spi_mask = 0;
788+
u32 spi_mask;
787789

788790
status = kstrtou8(buf, 10, &input);
789791
if (status) {
@@ -956,7 +958,6 @@ static int as9817_64_pcie_fpga_stat_probe(struct platform_device *pdev)
956958
int i;
957959
int status = 0, err = 0;
958960
unsigned long bar_base;
959-
void __iomem *data_base_addr0;
960961
unsigned int val;
961962

962963
fpga_ctl = devm_kzalloc(dev, sizeof(struct as9817_64_fpga_data), GFP_KERNEL);
@@ -986,14 +987,14 @@ static int as9817_64_pcie_fpga_stat_probe(struct platform_device *pdev)
986987
/*
987988
* Detect platform for changing the setting behavior of LP mode.
988989
*/
989-
data_base_addr0 = pci_iomap(pcidev, BAR0_NUM, 0);
990-
if (data_base_addr0 == NULL) {
990+
fpga_ctl->pci_fpga_dev.data_base_addr0 = pci_iomap(pcidev, BAR0_NUM, 0);
991+
if (fpga_ctl->pci_fpga_dev.data_base_addr0 == NULL) {
991992
dev_err(dev, "Failed to map BAR0\n");
992993
status = -EIO;
993994
goto exit_pci_disable;
994995
}
995996

996-
val = ioread8(data_base_addr0 + FPGA_BOARD_INFO_REG);
997+
val = ioread8(fpga_ctl->pci_fpga_dev.data_base_addr0 + FPGA_BOARD_INFO_REG);
997998
switch (val & 0x0C)
998999
{
9991000
case 0x00: /* OSFP */
@@ -1013,7 +1014,15 @@ static int as9817_64_pcie_fpga_stat_probe(struct platform_device *pdev)
10131014
dev_warn(dev, "Unknown platform detected\n");
10141015
break;
10151016
}
1016-
pci_iounmap(pcidev, data_base_addr0);
1017+
1018+
/*
1019+
* The register address of SPI Busy is 0x33.
1020+
* It can not only read one byte. It needs to read four bytes from 0x30.
1021+
* The value is obtained by '(ioread32(spi_busy_reg) >> 24) & 0xFF'.
1022+
*/
1023+
spi_busy_reg = fpga_ctl->pci_fpga_dev.data_base_addr0 + 0x30;
1024+
1025+
10171026

10181027
/*
10191028
* Cannot use 'pci_request_regions(pcidev, DRVNAME)'
@@ -1024,7 +1033,7 @@ static int as9817_64_pcie_fpga_stat_probe(struct platform_device *pdev)
10241033
if (fpga_ctl->pci_fpga_dev.data_base_addr1 == NULL) {
10251034
dev_err(dev, "Failed to map BAR1\n");
10261035
status = -EIO;
1027-
goto exit_pci_disable;
1036+
goto exit_pci_iounmap0;
10281037
}
10291038
fpga_ctl->pci_fpga_dev.data_region1 = pci_resource_start(pcidev, BAR1_NUM) + CPLD1_PCIE_START_OFFSET;
10301039
ret = request_mem_region(fpga_ctl->pci_fpga_dev.data_region1, REGION_LEN, DRVNAME"_cpld1");
@@ -1104,6 +1113,9 @@ static int as9817_64_pcie_fpga_stat_probe(struct platform_device *pdev)
11041113
release_mem_region(fpga_ctl->pci_fpga_dev.data_region1, REGION_LEN);
11051114
exit_pci_iounmap1:
11061115
pci_iounmap(fpga_ctl->pci_fpga_dev.pci_dev, fpga_ctl->pci_fpga_dev.data_base_addr1);
1116+
exit_pci_iounmap0:
1117+
spi_busy_reg = NULL;
1118+
pci_iounmap(fpga_ctl->pci_fpga_dev.pci_dev, fpga_ctl->pci_fpga_dev.data_base_addr0);
11071119
exit_pci_disable:
11081120
pci_disable_device(fpga_ctl->pci_fpga_dev.pci_dev);
11091121

@@ -1122,6 +1134,8 @@ static int as9817_64_pcie_fpga_stat_remove(struct platform_device *pdev)
11221134
for (i = 0; i < PORT_NUM; i++) {
11231135
platform_device_unregister(fpga_ctl->pci_fpga_dev.fpga_i2c[i]);
11241136
}
1137+
spi_busy_reg = NULL;
1138+
pci_iounmap(fpga_ctl->pci_fpga_dev.pci_dev, fpga_ctl->pci_fpga_dev.data_base_addr0);
11251139
pci_iounmap(fpga_ctl->pci_fpga_dev.pci_dev, fpga_ctl->pci_fpga_dev.data_base_addr1);
11261140
pci_iounmap(fpga_ctl->pci_fpga_dev.pci_dev, fpga_ctl->pci_fpga_dev.data_base_addr2);
11271141
release_mem_region(fpga_ctl->pci_fpga_dev.data_region1, REGION_LEN);

packages/platforms/accton/x86-64/as9817-64/src/modules/x86-64-accton-as9817-64-i2c-ocores.c

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,8 @@ do { \
110110
spin_unlock(lock); \
111111
} while (0)
112112

113-
#define SPI_BUSY_ADDR (0xb3320000 + 0x30)
114-
#define IOREMAP_SIZE (0x04)
115-
static void __iomem *spi_busy_reg=NULL;
113+
void __iomem *spi_busy_reg=NULL;
114+
EXPORT_SYMBOL(spi_busy_reg);
116115
int wait_spi(u32 mask, unsigned long timeout) {
117116
u32 data;
118117
u32 ri = 0;
@@ -941,24 +940,11 @@ static int __init ocores_i2c_as9817_64_init(void)
941940

942941
spin_lock_init(&cpld_access_lock);
943942

944-
/*
945-
* The register address of SPI Busy is 0x33.
946-
* It can not only read one byte. It needs to read four bytes from 0x30.
947-
* The value is obtained by '(ioread32(spi_busy_reg) >> 24) & 0xFF'.
948-
*/
949-
spi_busy_reg = ioremap(SPI_BUSY_ADDR, IOREMAP_SIZE);
950-
if (!spi_busy_reg) {
951-
pr_err("could not remap spi_busy_reg memory\n");
952-
return -ENOMEM;
953-
}
954-
955943
return 0;
956944
}
957945
static void __exit ocores_i2c_as9817_64_exit(void)
958946
{
959947
platform_driver_unregister(&ocores_i2c_driver);
960-
961-
iounmap(spi_busy_reg);
962948
}
963949

964950
module_init(ocores_i2c_as9817_64_init);

packages/platforms/accton/x86-64/as9817-64/src/modules/x86-64-accton-as9817-64-leds.c

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <linux/ipmi.h>
3131
#include <linux/ipmi_smi.h>
3232
#include <linux/platform_device.h>
33+
#include <linux/string_helpers.h>
3334

3435
#define DRVNAME "as9817_64_led"
3536
#define ACCTON_IPMI_NETFN 0x34
@@ -238,23 +239,40 @@ static int ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd,
238239
{
239240
int status = 0, retry = 0;
240241

242+
char *cmdline = kstrdup_quotable_cmdline(current, GFP_KERNEL);
243+
244+
int i = 0;
245+
char raw_cmd[20] = "";
246+
sprintf(raw_cmd, "0x%02x", cmd);
247+
if(tx_len){
248+
for(i = 0; i < tx_len; i++)
249+
sprintf(raw_cmd + strlen(raw_cmd), " 0x%02x", tx_data[i]);
250+
}
251+
241252
for (retry = 0; retry <= IPMI_ERR_RETRY_TIMES; retry++) {
242253
status = _ipmi_send_message(ipmi, cmd, tx_data, tx_len, rx_data, rx_len);
243254
if (unlikely(status != 0)) {
244-
dev_err(&data->pdev->dev, "ipmi_send_message_%d err status(%d)\r\n",
245-
retry, status);
255+
dev_err(&data->pdev->dev,
256+
"ipmi_send_message_%d err status(%d)[%s] raw_cmd=[%s] tx_msgid=(%02x)\r\n",
257+
retry, status, cmdline ? cmdline : "", raw_cmd,
258+
(int)ipmi->tx_msgid);
246259
continue;
247260
}
248261

249262
if (unlikely(ipmi->rx_result != 0)) {
250-
dev_err(&data->pdev->dev, "ipmi_send_message_%d err result(%d)\r\n",
251-
retry, ipmi->rx_result);
263+
dev_err(&data->pdev->dev,
264+
"ipmi_send_message_%d err result(%d)[%s] raw_cmd=[%s] tx_msgid=(%02x)\r\n",
265+
retry, ipmi->rx_result, cmdline ? cmdline : "", raw_cmd,
266+
(int)ipmi->tx_msgid);
252267
continue;
253268
}
254269

255270
break;
256271
}
257272

273+
if (cmdline)
274+
kfree(cmdline);
275+
258276
return status;
259277
}
260278

0 commit comments

Comments
 (0)