Skip to content

Commit 9a6d33c

Browse files
committed
Merge branch 'qlcnic'
Shahed Shaikh says: ==================== qlcnic: Bug fixes This series fixes some bugs related to endianess. Please apply this series to net. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents d715569 + 3d8623e commit 9a6d33c

File tree

5 files changed

+114
-15
lines changed

5 files changed

+114
-15
lines changed

drivers/net/ethernet/qlogic/qlcnic/qlcnic.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ struct qlcnic_fdt {
268268
u16 cksum;
269269
u16 unused;
270270
u8 model[16];
271-
u16 mfg_id;
271+
u8 mfg_id;
272272
u16 id;
273273
u8 flag;
274274
u8 erase_cmd;
@@ -2362,6 +2362,19 @@ static inline u32 qlcnic_get_vnic_func_count(struct qlcnic_adapter *adapter)
23622362
return QLC_DEFAULT_VNIC_COUNT;
23632363
}
23642364

2365+
static inline void qlcnic_swap32_buffer(u32 *buffer, int count)
2366+
{
2367+
#if defined(__BIG_ENDIAN)
2368+
u32 *tmp = buffer;
2369+
int i;
2370+
2371+
for (i = 0; i < count; i++) {
2372+
*tmp = swab32(*tmp);
2373+
tmp++;
2374+
}
2375+
#endif
2376+
}
2377+
23652378
#ifdef CONFIG_QLCNIC_HWMON
23662379
void qlcnic_register_hwmon_dev(struct qlcnic_adapter *);
23672380
void qlcnic_unregister_hwmon_dev(struct qlcnic_adapter *);

drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2603,7 +2603,7 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter,
26032603
}
26042604

26052605
qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_DIRECT_WINDOW,
2606-
(addr));
2606+
(addr & 0xFFFF0000));
26072607

26082608
range = flash_offset + (count * sizeof(u32));
26092609
/* Check if data is spread across multiple sectors */
@@ -2753,7 +2753,7 @@ int qlcnic_83xx_read_flash_descriptor_table(struct qlcnic_adapter *adapter)
27532753
ret = qlcnic_83xx_lockless_flash_read32(adapter, QLCNIC_FDT_LOCATION,
27542754
(u8 *)&adapter->ahw->fdt,
27552755
count);
2756-
2756+
qlcnic_swap32_buffer((u32 *)&adapter->ahw->fdt, count);
27572757
qlcnic_83xx_unlock_flash(adapter);
27582758
return ret;
27592759
}
@@ -2788,7 +2788,7 @@ int qlcnic_83xx_erase_flash_sector(struct qlcnic_adapter *adapter,
27882788

27892789
addr1 = (sector_start_addr & 0xFF) << 16;
27902790
addr2 = (sector_start_addr & 0xFF0000) >> 16;
2791-
reversed_addr = addr1 | addr2;
2791+
reversed_addr = addr1 | addr2 | (sector_start_addr & 0xFF00);
27922792

27932793
qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_WRDATA,
27942794
reversed_addr);

drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1378,47 +1378,62 @@ static int qlcnic_83xx_copy_fw_file(struct qlcnic_adapter *adapter)
13781378
{
13791379
struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info;
13801380
const struct firmware *fw = fw_info->fw;
1381-
u32 dest, *p_cache;
1381+
u32 dest, *p_cache, *temp;
13821382
int i, ret = -EIO;
1383+
__le32 *temp_le;
13831384
u8 data[16];
13841385
size_t size;
13851386
u64 addr;
13861387

1388+
temp = kzalloc(fw->size, GFP_KERNEL);
1389+
if (!temp) {
1390+
release_firmware(fw);
1391+
fw_info->fw = NULL;
1392+
return -ENOMEM;
1393+
}
1394+
1395+
temp_le = (__le32 *)fw->data;
1396+
1397+
/* FW image in file is in little endian, swap the data to nullify
1398+
* the effect of writel() operation on big endian platform.
1399+
*/
1400+
for (i = 0; i < fw->size / sizeof(u32); i++)
1401+
temp[i] = __le32_to_cpu(temp_le[i]);
1402+
13871403
dest = QLCRDX(adapter->ahw, QLCNIC_FW_IMAGE_ADDR);
13881404
size = (fw->size & ~0xF);
1389-
p_cache = (u32 *)fw->data;
1405+
p_cache = temp;
13901406
addr = (u64)dest;
13911407

13921408
ret = qlcnic_ms_mem_write128(adapter, addr,
13931409
p_cache, size / 16);
13941410
if (ret) {
13951411
dev_err(&adapter->pdev->dev, "MS memory write failed\n");
1396-
release_firmware(fw);
1397-
fw_info->fw = NULL;
1398-
return -EIO;
1412+
goto exit;
13991413
}
14001414

14011415
/* alignment check */
14021416
if (fw->size & 0xF) {
14031417
addr = dest + size;
14041418
for (i = 0; i < (fw->size & 0xF); i++)
1405-
data[i] = fw->data[size + i];
1419+
data[i] = temp[size + i];
14061420
for (; i < 16; i++)
14071421
data[i] = 0;
14081422
ret = qlcnic_ms_mem_write128(adapter, addr,
14091423
(u32 *)data, 1);
14101424
if (ret) {
14111425
dev_err(&adapter->pdev->dev,
14121426
"MS memory write failed\n");
1413-
release_firmware(fw);
1414-
fw_info->fw = NULL;
1415-
return -EIO;
1427+
goto exit;
14161428
}
14171429
}
1430+
1431+
exit:
14181432
release_firmware(fw);
14191433
fw_info->fw = NULL;
1434+
kfree(temp);
14201435

1421-
return 0;
1436+
return ret;
14221437
}
14231438

14241439
static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)

drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,48 +47,83 @@ struct qlcnic_common_entry_hdr {
4747
u32 type;
4848
u32 offset;
4949
u32 cap_size;
50+
#if defined(__LITTLE_ENDIAN)
5051
u8 mask;
5152
u8 rsvd[2];
5253
u8 flags;
54+
#else
55+
u8 flags;
56+
u8 rsvd[2];
57+
u8 mask;
58+
#endif
5359
} __packed;
5460

5561
struct __crb {
5662
u32 addr;
63+
#if defined(__LITTLE_ENDIAN)
5764
u8 stride;
5865
u8 rsvd1[3];
66+
#else
67+
u8 rsvd1[3];
68+
u8 stride;
69+
#endif
5970
u32 data_size;
6071
u32 no_ops;
6172
u32 rsvd2[4];
6273
} __packed;
6374

6475
struct __ctrl {
6576
u32 addr;
77+
#if defined(__LITTLE_ENDIAN)
6678
u8 stride;
6779
u8 index_a;
6880
u16 timeout;
81+
#else
82+
u16 timeout;
83+
u8 index_a;
84+
u8 stride;
85+
#endif
6986
u32 data_size;
7087
u32 no_ops;
88+
#if defined(__LITTLE_ENDIAN)
7189
u8 opcode;
7290
u8 index_v;
7391
u8 shl_val;
7492
u8 shr_val;
93+
#else
94+
u8 shr_val;
95+
u8 shl_val;
96+
u8 index_v;
97+
u8 opcode;
98+
#endif
7599
u32 val1;
76100
u32 val2;
77101
u32 val3;
78102
} __packed;
79103

80104
struct __cache {
81105
u32 addr;
106+
#if defined(__LITTLE_ENDIAN)
82107
u16 stride;
83108
u16 init_tag_val;
109+
#else
110+
u16 init_tag_val;
111+
u16 stride;
112+
#endif
84113
u32 size;
85114
u32 no_ops;
86115
u32 ctrl_addr;
87116
u32 ctrl_val;
88117
u32 read_addr;
118+
#if defined(__LITTLE_ENDIAN)
89119
u8 read_addr_stride;
90120
u8 read_addr_num;
91121
u8 rsvd1[2];
122+
#else
123+
u8 rsvd1[2];
124+
u8 read_addr_num;
125+
u8 read_addr_stride;
126+
#endif
92127
} __packed;
93128

94129
struct __ocm {
@@ -122,23 +157,39 @@ struct __mux {
122157

123158
struct __queue {
124159
u32 sel_addr;
160+
#if defined(__LITTLE_ENDIAN)
125161
u16 stride;
126162
u8 rsvd[2];
163+
#else
164+
u8 rsvd[2];
165+
u16 stride;
166+
#endif
127167
u32 size;
128168
u32 no_ops;
129169
u8 rsvd2[8];
130170
u32 read_addr;
171+
#if defined(__LITTLE_ENDIAN)
131172
u8 read_addr_stride;
132173
u8 read_addr_cnt;
133174
u8 rsvd3[2];
175+
#else
176+
u8 rsvd3[2];
177+
u8 read_addr_cnt;
178+
u8 read_addr_stride;
179+
#endif
134180
} __packed;
135181

136182
struct __pollrd {
137183
u32 sel_addr;
138184
u32 read_addr;
139185
u32 sel_val;
186+
#if defined(__LITTLE_ENDIAN)
140187
u16 sel_val_stride;
141188
u16 no_ops;
189+
#else
190+
u16 no_ops;
191+
u16 sel_val_stride;
192+
#endif
142193
u32 poll_wait;
143194
u32 poll_mask;
144195
u32 data_size;
@@ -153,9 +204,15 @@ struct __mux2 {
153204
u32 no_ops;
154205
u32 sel_val_mask;
155206
u32 read_addr;
207+
#if defined(__LITTLE_ENDIAN)
156208
u8 sel_val_stride;
157209
u8 data_size;
158210
u8 rsvd[2];
211+
#else
212+
u8 rsvd[2];
213+
u8 data_size;
214+
u8 sel_val_stride;
215+
#endif
159216
} __packed;
160217

161218
struct __pollrdmwr {

drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ static ssize_t qlcnic_sysfs_read_crb(struct file *filp, struct kobject *kobj,
280280
if (ret != 0)
281281
return ret;
282282
qlcnic_read_crb(adapter, buf, offset, size);
283+
qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
283284

284285
return size;
285286
}
@@ -296,6 +297,7 @@ static ssize_t qlcnic_sysfs_write_crb(struct file *filp, struct kobject *kobj,
296297
if (ret != 0)
297298
return ret;
298299

300+
qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
299301
qlcnic_write_crb(adapter, buf, offset, size);
300302
return size;
301303
}
@@ -329,6 +331,7 @@ static ssize_t qlcnic_sysfs_read_mem(struct file *filp, struct kobject *kobj,
329331
return -EIO;
330332

331333
memcpy(buf, &data, size);
334+
qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
332335

333336
return size;
334337
}
@@ -346,6 +349,7 @@ static ssize_t qlcnic_sysfs_write_mem(struct file *filp, struct kobject *kobj,
346349
if (ret != 0)
347350
return ret;
348351

352+
qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
349353
memcpy(&data, buf, size);
350354

351355
if (qlcnic_pci_mem_write_2M(adapter, offset, data))
@@ -412,6 +416,7 @@ static ssize_t qlcnic_sysfs_write_pm_config(struct file *filp,
412416
if (rem)
413417
return QL_STATUS_INVALID_PARAM;
414418

419+
qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
415420
pm_cfg = (struct qlcnic_pm_func_cfg *)buf;
416421
ret = validate_pm_config(adapter, pm_cfg, count);
417422

@@ -474,6 +479,7 @@ static ssize_t qlcnic_sysfs_read_pm_config(struct file *filp,
474479
pm_cfg[pci_func].dest_npar = 0;
475480
pm_cfg[pci_func].pci_func = i;
476481
}
482+
qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
477483
return size;
478484
}
479485

@@ -555,6 +561,7 @@ static ssize_t qlcnic_sysfs_write_esw_config(struct file *file,
555561
if (rem)
556562
return QL_STATUS_INVALID_PARAM;
557563

564+
qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
558565
esw_cfg = (struct qlcnic_esw_func_cfg *)buf;
559566
ret = validate_esw_config(adapter, esw_cfg, count);
560567
if (ret)
@@ -649,6 +656,7 @@ static ssize_t qlcnic_sysfs_read_esw_config(struct file *file,
649656
if (qlcnic_get_eswitch_port_config(adapter, &esw_cfg[pci_func]))
650657
return QL_STATUS_INVALID_PARAM;
651658
}
659+
qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
652660
return size;
653661
}
654662

@@ -688,6 +696,7 @@ static ssize_t qlcnic_sysfs_write_npar_config(struct file *file,
688696
if (rem)
689697
return QL_STATUS_INVALID_PARAM;
690698

699+
qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
691700
np_cfg = (struct qlcnic_npar_func_cfg *)buf;
692701
ret = validate_npar_config(adapter, np_cfg, count);
693702
if (ret)
@@ -759,6 +768,7 @@ static ssize_t qlcnic_sysfs_read_npar_config(struct file *file,
759768
np_cfg[pci_func].max_tx_queues = nic_info.max_tx_ques;
760769
np_cfg[pci_func].max_rx_queues = nic_info.max_rx_ques;
761770
}
771+
qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
762772
return size;
763773
}
764774

@@ -916,6 +926,7 @@ static ssize_t qlcnic_sysfs_read_pci_config(struct file *file,
916926

917927
pci_cfg = (struct qlcnic_pci_func_cfg *)buf;
918928
count = size / sizeof(struct qlcnic_pci_func_cfg);
929+
qlcnic_swap32_buffer((u32 *)pci_info, size / sizeof(u32));
919930
for (i = 0; i < count; i++) {
920931
pci_cfg[i].pci_func = pci_info[i].id;
921932
pci_cfg[i].func_type = pci_info[i].type;
@@ -969,6 +980,7 @@ static ssize_t qlcnic_83xx_sysfs_flash_read_handler(struct file *filp,
969980
}
970981

971982
qlcnic_83xx_unlock_flash(adapter);
983+
qlcnic_swap32_buffer((u32 *)p_read_buf, count);
972984
memcpy(buf, p_read_buf, size);
973985
kfree(p_read_buf);
974986

@@ -986,9 +998,10 @@ static int qlcnic_83xx_sysfs_flash_bulk_write(struct qlcnic_adapter *adapter,
986998
if (!p_cache)
987999
return -ENOMEM;
9881000

1001+
count = size / sizeof(u32);
1002+
qlcnic_swap32_buffer((u32 *)buf, count);
9891003
memcpy(p_cache, buf, size);
9901004
p_src = p_cache;
991-
count = size / sizeof(u32);
9921005

9931006
if (qlcnic_83xx_lock_flash(adapter) != 0) {
9941007
kfree(p_cache);
@@ -1053,6 +1066,7 @@ static int qlcnic_83xx_sysfs_flash_write(struct qlcnic_adapter *adapter,
10531066
if (!p_cache)
10541067
return -ENOMEM;
10551068

1069+
qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
10561070
memcpy(p_cache, buf, size);
10571071
p_src = p_cache;
10581072
count = size / sizeof(u32);

0 commit comments

Comments
 (0)