2 * Copyright(c) 2015, 2016 Intel Corporation.
4 * This file is provided under a dual BSD/GPLv2 license. When using or
5 * redistributing this file, you may do so under either license.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of version 2 of the GNU General Public License as
11 * published by the Free Software Foundation.
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
20 * Redistribution and use in source and binary forms, with or without
21 * modification, are permitted provided that the following conditions
24 * - Redistributions of source code must retain the above copyright
25 * notice, this list of conditions and the following disclaimer.
26 * - Redistributions in binary form must reproduce the above copyright
27 * notice, this list of conditions and the following disclaimer in
28 * the documentation and/or other materials provided with the
30 * - Neither the name of Intel Corporation nor the names of its
31 * contributors may be used to endorse or promote products derived
32 * from this software without specific prior written permission.
34 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
35 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
36 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
37 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
38 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
39 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
40 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
41 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
42 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
43 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
44 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
48 #include <linux/delay.h>
49 #include <linux/pci.h>
50 #include <linux/vmalloc.h>
54 /* for the given bus number, return the CSR for reading an i2c line */
55 static inline u32
i2c_in_csr(u32 bus_num
)
57 return bus_num
? ASIC_QSFP2_IN
: ASIC_QSFP1_IN
;
60 /* for the given bus number, return the CSR for writing an i2c line */
61 static inline u32
i2c_oe_csr(u32 bus_num
)
63 return bus_num
? ASIC_QSFP2_OE
: ASIC_QSFP1_OE
;
66 static void hfi1_setsda(void *data
, int state
)
68 struct hfi1_i2c_bus
*bus
= (struct hfi1_i2c_bus
*)data
;
69 struct hfi1_devdata
*dd
= bus
->controlling_dd
;
73 target_oe
= i2c_oe_csr(bus
->num
);
74 reg
= read_csr(dd
, target_oe
);
76 * The OE bit value is inverted and connected to the pin. When
77 * OE is 0 the pin is left to be pulled up, when the OE is 1
78 * the pin is driven low. This matches the "open drain" or "open
79 * collector" convention.
82 reg
&= ~QSFP_HFI0_I2CDAT
;
84 reg
|= QSFP_HFI0_I2CDAT
;
85 write_csr(dd
, target_oe
, reg
);
86 /* do a read to force the write into the chip */
87 (void)read_csr(dd
, target_oe
);
90 static void hfi1_setscl(void *data
, int state
)
92 struct hfi1_i2c_bus
*bus
= (struct hfi1_i2c_bus
*)data
;
93 struct hfi1_devdata
*dd
= bus
->controlling_dd
;
97 target_oe
= i2c_oe_csr(bus
->num
);
98 reg
= read_csr(dd
, target_oe
);
100 * The OE bit value is inverted and connected to the pin. When
101 * OE is 0 the pin is left to be pulled up, when the OE is 1
102 * the pin is driven low. This matches the "open drain" or "open
103 * collector" convention.
106 reg
&= ~QSFP_HFI0_I2CCLK
;
108 reg
|= QSFP_HFI0_I2CCLK
;
109 write_csr(dd
, target_oe
, reg
);
110 /* do a read to force the write into the chip */
111 (void)read_csr(dd
, target_oe
);
114 static int hfi1_getsda(void *data
)
116 struct hfi1_i2c_bus
*bus
= (struct hfi1_i2c_bus
*)data
;
120 hfi1_setsda(data
, 1); /* clear OE so we do not pull line down */
121 udelay(2); /* 1us pull up + 250ns hold */
123 target_in
= i2c_in_csr(bus
->num
);
124 reg
= read_csr(bus
->controlling_dd
, target_in
);
125 return !!(reg
& QSFP_HFI0_I2CDAT
);
128 static int hfi1_getscl(void *data
)
130 struct hfi1_i2c_bus
*bus
= (struct hfi1_i2c_bus
*)data
;
134 hfi1_setscl(data
, 1); /* clear OE so we do not pull line down */
135 udelay(2); /* 1us pull up + 250ns hold */
137 target_in
= i2c_in_csr(bus
->num
);
138 reg
= read_csr(bus
->controlling_dd
, target_in
);
139 return !!(reg
& QSFP_HFI0_I2CCLK
);
143 * Allocate and initialize the given i2c bus number.
144 * Returns NULL on failure.
146 static struct hfi1_i2c_bus
*init_i2c_bus(struct hfi1_devdata
*dd
,
147 struct hfi1_asic_data
*ad
, int num
)
149 struct hfi1_i2c_bus
*bus
;
152 bus
= kzalloc(sizeof(*bus
), GFP_KERNEL
);
156 bus
->controlling_dd
= dd
;
157 bus
->num
= num
; /* our bus number */
159 bus
->algo
.setsda
= hfi1_setsda
;
160 bus
->algo
.setscl
= hfi1_setscl
;
161 bus
->algo
.getsda
= hfi1_getsda
;
162 bus
->algo
.getscl
= hfi1_getscl
;
163 bus
->algo
.udelay
= 5;
164 bus
->algo
.timeout
= usecs_to_jiffies(100000);
165 bus
->algo
.data
= bus
;
167 bus
->adapter
.owner
= THIS_MODULE
;
168 bus
->adapter
.algo_data
= &bus
->algo
;
169 bus
->adapter
.dev
.parent
= &dd
->pcidev
->dev
;
170 snprintf(bus
->adapter
.name
, sizeof(bus
->adapter
.name
),
173 ret
= i2c_bit_add_bus(&bus
->adapter
);
175 dd_dev_info(dd
, "%s: unable to add i2c bus %d, err %d\n",
185 * Initialize i2c buses.
186 * Return 0 on success, -errno on error.
188 int set_up_i2c(struct hfi1_devdata
*dd
, struct hfi1_asic_data
*ad
)
190 ad
->i2c_bus0
= init_i2c_bus(dd
, ad
, 0);
191 ad
->i2c_bus1
= init_i2c_bus(dd
, ad
, 1);
192 if (!ad
->i2c_bus0
|| !ad
->i2c_bus1
)
197 static void clean_i2c_bus(struct hfi1_i2c_bus
*bus
)
200 i2c_del_adapter(&bus
->adapter
);
205 void clean_up_i2c(struct hfi1_devdata
*dd
, struct hfi1_asic_data
*ad
)
207 clean_i2c_bus(ad
->i2c_bus0
);
209 clean_i2c_bus(ad
->i2c_bus1
);
213 static int i2c_bus_write(struct hfi1_devdata
*dd
, struct hfi1_i2c_bus
*i2c
,
214 u8 slave_addr
, int offset
, int offset_size
,
220 struct i2c_msg msgs
[2];
222 switch (offset_size
) {
225 msgs
[0].addr
= slave_addr
;
231 offset_bytes
[1] = (offset
>> 8) & 0xff;
235 offset_bytes
[0] = offset
& 0xff;
237 msgs
[0].addr
= slave_addr
;
239 msgs
[0].len
= offset_size
;
240 msgs
[0].buf
= offset_bytes
;
242 msgs
[1].addr
= slave_addr
;
243 msgs
[1].flags
= I2C_M_NOSTART
,
251 i2c
->controlling_dd
= dd
;
252 ret
= i2c_transfer(&i2c
->adapter
, msgs
, num_msgs
);
253 if (ret
!= num_msgs
) {
254 dd_dev_err(dd
, "%s: bus %d, i2c slave 0x%x, offset 0x%x, len 0x%x; write failed, ret %d\n",
255 __func__
, i2c
->num
, slave_addr
, offset
, len
, ret
);
256 return ret
< 0 ? ret
: -EIO
;
261 static int i2c_bus_read(struct hfi1_devdata
*dd
, struct hfi1_i2c_bus
*bus
,
262 u8 slave_addr
, int offset
, int offset_size
,
268 struct i2c_msg msgs
[2];
270 switch (offset_size
) {
273 msgs
[0].addr
= slave_addr
;
274 msgs
[0].flags
= I2C_M_RD
;
279 offset_bytes
[1] = (offset
>> 8) & 0xff;
283 offset_bytes
[0] = offset
& 0xff;
285 msgs
[0].addr
= slave_addr
;
287 msgs
[0].len
= offset_size
;
288 msgs
[0].buf
= offset_bytes
;
290 msgs
[1].addr
= slave_addr
;
291 msgs
[1].flags
= I2C_M_RD
,
299 bus
->controlling_dd
= dd
;
300 ret
= i2c_transfer(&bus
->adapter
, msgs
, num_msgs
);
301 if (ret
!= num_msgs
) {
302 dd_dev_err(dd
, "%s: bus %d, i2c slave 0x%x, offset 0x%x, len 0x%x; read failed, ret %d\n",
303 __func__
, bus
->num
, slave_addr
, offset
, len
, ret
);
304 return ret
< 0 ? ret
: -EIO
;
310 * Raw i2c write. No set-up or lock checking.
312 * Return 0 on success, -errno on error.
314 static int __i2c_write(struct hfi1_pportdata
*ppd
, u32 target
, int i2c_addr
,
315 int offset
, void *bp
, int len
)
317 struct hfi1_devdata
*dd
= ppd
->dd
;
318 struct hfi1_i2c_bus
*bus
;
322 bus
= target
? dd
->asic_data
->i2c_bus1
: dd
->asic_data
->i2c_bus0
;
323 slave_addr
= (i2c_addr
& 0xff) >> 1; /* convert to 7-bit addr */
324 offset_size
= (i2c_addr
>> 8) & 0x3;
325 return i2c_bus_write(dd
, bus
, slave_addr
, offset
, offset_size
, bp
, len
);
329 * Caller must hold the i2c chain resource.
331 * Return number of bytes written, or -errno.
333 int i2c_write(struct hfi1_pportdata
*ppd
, u32 target
, int i2c_addr
, int offset
,
338 if (!check_chip_resource(ppd
->dd
, i2c_target(target
), __func__
))
341 ret
= __i2c_write(ppd
, target
, i2c_addr
, offset
, bp
, len
);
349 * Raw i2c read. No set-up or lock checking.
351 * Return 0 on success, -errno on error.
353 static int __i2c_read(struct hfi1_pportdata
*ppd
, u32 target
, int i2c_addr
,
354 int offset
, void *bp
, int len
)
356 struct hfi1_devdata
*dd
= ppd
->dd
;
357 struct hfi1_i2c_bus
*bus
;
361 bus
= target
? dd
->asic_data
->i2c_bus1
: dd
->asic_data
->i2c_bus0
;
362 slave_addr
= (i2c_addr
& 0xff) >> 1; /* convert to 7-bit addr */
363 offset_size
= (i2c_addr
>> 8) & 0x3;
364 return i2c_bus_read(dd
, bus
, slave_addr
, offset
, offset_size
, bp
, len
);
368 * Caller must hold the i2c chain resource.
370 * Return number of bytes read, or -errno.
372 int i2c_read(struct hfi1_pportdata
*ppd
, u32 target
, int i2c_addr
, int offset
,
377 if (!check_chip_resource(ppd
->dd
, i2c_target(target
), __func__
))
380 ret
= __i2c_read(ppd
, target
, i2c_addr
, offset
, bp
, len
);
388 * Write page n, offset m of QSFP memory as defined by SFF 8636
389 * by writing @addr = ((256 * n) + m)
391 * Caller must hold the i2c chain resource.
393 * Return number of bytes written or -errno.
395 int qsfp_write(struct hfi1_pportdata
*ppd
, u32 target
, int addr
, void *bp
,
404 if (!check_chip_resource(ppd
->dd
, i2c_target(target
), __func__
))
407 while (count
< len
) {
409 * Set the qsfp page based on a zero-based address
410 * and a page size of QSFP_PAGESIZE bytes.
412 page
= (u8
)(addr
/ QSFP_PAGESIZE
);
414 ret
= __i2c_write(ppd
, target
, QSFP_DEV
| QSFP_OFFSET_SIZE
,
415 QSFP_PAGE_SELECT_BYTE_OFFS
, &page
, 1);
416 /* QSFPs require a 5-10msec delay after write operations */
419 hfi1_dev_porterr(ppd
->dd
, ppd
->port
,
420 "QSFP chain %d can't write QSFP_PAGE_SELECT_BYTE: %d\n",
425 offset
= addr
% QSFP_PAGESIZE
;
426 nwrite
= len
- count
;
427 /* truncate write to boundary if crossing boundary */
428 if (((addr
% QSFP_RW_BOUNDARY
) + nwrite
) > QSFP_RW_BOUNDARY
)
429 nwrite
= QSFP_RW_BOUNDARY
- (addr
% QSFP_RW_BOUNDARY
);
431 ret
= __i2c_write(ppd
, target
, QSFP_DEV
| QSFP_OFFSET_SIZE
,
432 offset
, bp
+ count
, nwrite
);
433 /* QSFPs require a 5-10msec delay after write operations */
435 if (ret
) /* stop on error */
448 * Perform a stand-alone single QSFP write. Acquire the resource, do the
449 * write, then release the resource.
451 int one_qsfp_write(struct hfi1_pportdata
*ppd
, u32 target
, int addr
, void *bp
,
454 struct hfi1_devdata
*dd
= ppd
->dd
;
455 u32 resource
= qsfp_resource(dd
);
458 ret
= acquire_chip_resource(dd
, resource
, QSFP_WAIT
);
461 ret
= qsfp_write(ppd
, target
, addr
, bp
, len
);
462 release_chip_resource(dd
, resource
);
468 * Access page n, offset m of QSFP memory as defined by SFF 8636
469 * by reading @addr = ((256 * n) + m)
471 * Caller must hold the i2c chain resource.
473 * Return the number of bytes read or -errno.
475 int qsfp_read(struct hfi1_pportdata
*ppd
, u32 target
, int addr
, void *bp
,
484 if (!check_chip_resource(ppd
->dd
, i2c_target(target
), __func__
))
487 while (count
< len
) {
489 * Set the qsfp page based on a zero-based address
490 * and a page size of QSFP_PAGESIZE bytes.
492 page
= (u8
)(addr
/ QSFP_PAGESIZE
);
493 ret
= __i2c_write(ppd
, target
, QSFP_DEV
| QSFP_OFFSET_SIZE
,
494 QSFP_PAGE_SELECT_BYTE_OFFS
, &page
, 1);
495 /* QSFPs require a 5-10msec delay after write operations */
498 hfi1_dev_porterr(ppd
->dd
, ppd
->port
,
499 "QSFP chain %d can't write QSFP_PAGE_SELECT_BYTE: %d\n",
504 offset
= addr
% QSFP_PAGESIZE
;
506 /* truncate read to boundary if crossing boundary */
507 if (((addr
% QSFP_RW_BOUNDARY
) + nread
) > QSFP_RW_BOUNDARY
)
508 nread
= QSFP_RW_BOUNDARY
- (addr
% QSFP_RW_BOUNDARY
);
510 ret
= __i2c_read(ppd
, target
, QSFP_DEV
| QSFP_OFFSET_SIZE
,
511 offset
, bp
+ count
, nread
);
512 if (ret
) /* stop on error */
525 * Perform a stand-alone single QSFP read. Acquire the resource, do the
526 * read, then release the resource.
528 int one_qsfp_read(struct hfi1_pportdata
*ppd
, u32 target
, int addr
, void *bp
,
531 struct hfi1_devdata
*dd
= ppd
->dd
;
532 u32 resource
= qsfp_resource(dd
);
535 ret
= acquire_chip_resource(dd
, resource
, QSFP_WAIT
);
538 ret
= qsfp_read(ppd
, target
, addr
, bp
, len
);
539 release_chip_resource(dd
, resource
);
545 * This function caches the QSFP memory range in 128 byte chunks.
546 * As an example, the next byte after address 255 is byte 128 from
547 * upper page 01H (if existing) rather than byte 0 from lower page 00H.
548 * Access page n, offset m of QSFP memory as defined by SFF 8636
549 * in the cache by reading byte ((128 * n) + m)
550 * The calls to qsfp_{read,write} in this function correctly handle the
551 * address map difference between this mapping and the mapping implemented
554 * The caller must be holding the QSFP i2c chain resource.
556 int refresh_qsfp_cache(struct hfi1_pportdata
*ppd
, struct qsfp_data
*cp
)
558 u32 target
= ppd
->dd
->hfi1_id
;
561 u8
*cache
= &cp
->cache
[0];
563 /* ensure sane contents on invalid reads, for cable swaps */
564 memset(cache
, 0, (QSFP_MAX_NUM_PAGES
* 128));
565 spin_lock_irqsave(&ppd
->qsfp_info
.qsfp_lock
, flags
);
566 ppd
->qsfp_info
.cache_valid
= 0;
567 spin_unlock_irqrestore(&ppd
->qsfp_info
.qsfp_lock
, flags
);
569 if (!qsfp_mod_present(ppd
)) {
574 ret
= qsfp_read(ppd
, target
, 0, cache
, QSFP_PAGESIZE
);
575 if (ret
!= QSFP_PAGESIZE
) {
577 "%s: Page 0 read failed, expected %d, got %d\n",
578 __func__
, QSFP_PAGESIZE
, ret
);
582 /* Is paging enabled? */
583 if (!(cache
[2] & 4)) {
584 /* Paging enabled, page 03 required */
585 if ((cache
[195] & 0xC0) == 0xC0) {
587 ret
= qsfp_read(ppd
, target
, 384, cache
+ 256, 128);
588 if (ret
<= 0 || ret
!= 128) {
589 dd_dev_info(ppd
->dd
, "%s failed\n", __func__
);
592 ret
= qsfp_read(ppd
, target
, 640, cache
+ 384, 128);
593 if (ret
<= 0 || ret
!= 128) {
594 dd_dev_info(ppd
->dd
, "%s failed\n", __func__
);
597 ret
= qsfp_read(ppd
, target
, 896, cache
+ 512, 128);
598 if (ret
<= 0 || ret
!= 128) {
599 dd_dev_info(ppd
->dd
, "%s failed\n", __func__
);
602 } else if ((cache
[195] & 0x80) == 0x80) {
603 /* only page 2 and 3 */
604 ret
= qsfp_read(ppd
, target
, 640, cache
+ 384, 128);
605 if (ret
<= 0 || ret
!= 128) {
606 dd_dev_info(ppd
->dd
, "%s failed\n", __func__
);
609 ret
= qsfp_read(ppd
, target
, 896, cache
+ 512, 128);
610 if (ret
<= 0 || ret
!= 128) {
611 dd_dev_info(ppd
->dd
, "%s failed\n", __func__
);
614 } else if ((cache
[195] & 0x40) == 0x40) {
615 /* only page 1 and 3 */
616 ret
= qsfp_read(ppd
, target
, 384, cache
+ 256, 128);
617 if (ret
<= 0 || ret
!= 128) {
618 dd_dev_info(ppd
->dd
, "%s failed\n", __func__
);
621 ret
= qsfp_read(ppd
, target
, 896, cache
+ 512, 128);
622 if (ret
<= 0 || ret
!= 128) {
623 dd_dev_info(ppd
->dd
, "%s failed\n", __func__
);
628 ret
= qsfp_read(ppd
, target
, 896, cache
+ 512, 128);
629 if (ret
<= 0 || ret
!= 128) {
630 dd_dev_info(ppd
->dd
, "%s failed\n", __func__
);
636 spin_lock_irqsave(&ppd
->qsfp_info
.qsfp_lock
, flags
);
637 ppd
->qsfp_info
.cache_valid
= 1;
638 ppd
->qsfp_info
.cache_refresh_required
= 0;
639 spin_unlock_irqrestore(&ppd
->qsfp_info
.qsfp_lock
, flags
);
644 memset(cache
, 0, (QSFP_MAX_NUM_PAGES
* 128));
648 const char * const hfi1_qsfp_devtech
[16] = {
649 "850nm VCSEL", "1310nm VCSEL", "1550nm VCSEL", "1310nm FP",
650 "1310nm DFB", "1550nm DFB", "1310nm EML", "1550nm EML",
651 "Cu Misc", "1490nm DFB", "Cu NoEq", "Cu Eq",
652 "Undef", "Cu Active BothEq", "Cu FarEq", "Cu NearEq"
655 #define QSFP_DUMP_CHUNK 16 /* Holds longest string */
656 #define QSFP_DEFAULT_HDR_CNT 224
658 #define QSFP_PWR(pbyte) (((pbyte) >> 6) & 3)
659 #define QSFP_HIGH_PWR(pbyte) ((pbyte) & 3)
660 /* For use with QSFP_HIGH_PWR macro */
661 #define QSFP_HIGH_PWR_UNUSED 0 /* Bits [1:0] = 00 implies low power module */
664 * Takes power class byte [Page 00 Byte 129] in SFF 8636
665 * Returns power class as integer (1 through 7, per SFF 8636 rev 2.4)
667 int get_qsfp_power_class(u8 power_byte
)
669 if (QSFP_HIGH_PWR(power_byte
) == QSFP_HIGH_PWR_UNUSED
)
670 /* power classes count from 1, their bit encodings from 0 */
671 return (QSFP_PWR(power_byte
) + 1);
673 * 00 in the high power classes stands for unused, bringing
674 * balance to the off-by-1 offset above, we add 4 here to
675 * account for the difference between the low and high power
678 return (QSFP_HIGH_PWR(power_byte
) + 4);
681 int qsfp_mod_present(struct hfi1_pportdata
*ppd
)
683 struct hfi1_devdata
*dd
= ppd
->dd
;
686 reg
= read_csr(dd
, dd
->hfi1_id
? ASIC_QSFP2_IN
: ASIC_QSFP1_IN
);
687 return !(reg
& QSFP_HFI0_MODPRST_N
);
691 * This function maps QSFP memory addresses in 128 byte chunks in the following
692 * fashion per the CableInfo SMA query definition in the IBA 1.3 spec/OPA Gen 1
694 * For addr 000-127, lower page 00h
695 * For addr 128-255, upper page 00h
696 * For addr 256-383, upper page 01h
697 * For addr 384-511, upper page 02h
698 * For addr 512-639, upper page 03h
700 * For addresses beyond this range, it returns the invalid range of data buffer
702 * For upper pages that are optional, if they are not valid, returns the
703 * particular range of bytes in the data buffer set to 0.
705 int get_cable_info(struct hfi1_devdata
*dd
, u32 port_num
, u32 addr
, u32 len
,
708 struct hfi1_pportdata
*ppd
;
709 u32 excess_len
= len
;
710 int ret
= 0, offset
= 0;
712 if (port_num
> dd
->num_pports
|| port_num
< 1) {
713 dd_dev_info(dd
, "%s: Invalid port number %d\n",
719 ppd
= dd
->pport
+ (port_num
- 1);
720 if (!qsfp_mod_present(ppd
)) {
725 if (!ppd
->qsfp_info
.cache_valid
) {
730 if (addr
>= (QSFP_MAX_NUM_PAGES
* 128)) {
735 if ((addr
+ len
) > (QSFP_MAX_NUM_PAGES
* 128)) {
736 excess_len
= (addr
+ len
) - (QSFP_MAX_NUM_PAGES
* 128);
737 memcpy(data
, &ppd
->qsfp_info
.cache
[addr
], (len
- excess_len
));
738 data
+= (len
- excess_len
);
742 memcpy(data
, &ppd
->qsfp_info
.cache
[addr
], len
);
744 if (addr
<= QSFP_MONITOR_VAL_END
&&
745 (addr
+ len
) >= QSFP_MONITOR_VAL_START
) {
746 /* Overlap with the dynamic channel monitor range */
747 if (addr
< QSFP_MONITOR_VAL_START
) {
748 if (addr
+ len
<= QSFP_MONITOR_VAL_END
)
749 len
= addr
+ len
- QSFP_MONITOR_VAL_START
;
751 len
= QSFP_MONITOR_RANGE
;
752 offset
= QSFP_MONITOR_VAL_START
- addr
;
753 addr
= QSFP_MONITOR_VAL_START
;
754 } else if (addr
== QSFP_MONITOR_VAL_START
) {
756 if (addr
+ len
> QSFP_MONITOR_VAL_END
)
757 len
= QSFP_MONITOR_RANGE
;
760 if (addr
+ len
> QSFP_MONITOR_VAL_END
)
761 len
= QSFP_MONITOR_VAL_END
- addr
+ 1;
763 /* Refresh the values of the dynamic monitors from the cable */
764 ret
= one_qsfp_read(ppd
, dd
->hfi1_id
, addr
, data
+ offset
, len
);
774 memset(data
, 0, excess_len
);
778 static const char *pwr_codes
[8] = {"N/AW",
788 int qsfp_dump(struct hfi1_pportdata
*ppd
, char *buf
, int len
)
790 u8
*cache
= &ppd
->qsfp_info
.cache
[0];
791 u8 bin_buff
[QSFP_DUMP_CHUNK
];
795 u8
*atten
= &cache
[QSFP_ATTEN_OFFS
];
796 u8
*vendor_oui
= &cache
[QSFP_VOUI_OFFS
];
803 if (ppd
->qsfp_info
.cache_valid
) {
804 if (QSFP_IS_CU(cache
[QSFP_MOD_TECH_OFFS
]))
805 snprintf(lenstr
, sizeof(lenstr
), "%dM ",
806 cache
[QSFP_MOD_LEN_OFFS
]);
808 power_byte
= cache
[QSFP_MOD_PWR_OFFS
];
809 sofar
+= scnprintf(buf
+ sofar
, len
- sofar
, "PWR:%.3sW\n",
810 pwr_codes
[get_qsfp_power_class(power_byte
)]);
812 sofar
+= scnprintf(buf
+ sofar
, len
- sofar
, "TECH:%s%s\n",
814 hfi1_qsfp_devtech
[(cache
[QSFP_MOD_TECH_OFFS
]) >> 4]);
816 sofar
+= scnprintf(buf
+ sofar
, len
- sofar
, "Vendor:%.*s\n",
817 QSFP_VEND_LEN
, &cache
[QSFP_VEND_OFFS
]);
819 sofar
+= scnprintf(buf
+ sofar
, len
- sofar
, "OUI:%06X\n",
820 QSFP_OUI(vendor_oui
));
822 sofar
+= scnprintf(buf
+ sofar
, len
- sofar
, "Part#:%.*s\n",
823 QSFP_PN_LEN
, &cache
[QSFP_PN_OFFS
]);
825 sofar
+= scnprintf(buf
+ sofar
, len
- sofar
, "Rev:%.*s\n",
826 QSFP_REV_LEN
, &cache
[QSFP_REV_OFFS
]);
828 if (QSFP_IS_CU(cache
[QSFP_MOD_TECH_OFFS
]))
829 sofar
+= scnprintf(buf
+ sofar
, len
- sofar
,
831 QSFP_ATTEN_SDR(atten
),
832 QSFP_ATTEN_DDR(atten
));
834 sofar
+= scnprintf(buf
+ sofar
, len
- sofar
, "Serial:%.*s\n",
835 QSFP_SN_LEN
, &cache
[QSFP_SN_OFFS
]);
837 sofar
+= scnprintf(buf
+ sofar
, len
- sofar
, "Date:%.*s\n",
838 QSFP_DATE_LEN
, &cache
[QSFP_DATE_OFFS
]);
840 sofar
+= scnprintf(buf
+ sofar
, len
- sofar
, "Lot:%.*s\n",
841 QSFP_LOT_LEN
, &cache
[QSFP_LOT_OFFS
]);
843 while (bidx
< QSFP_DEFAULT_HDR_CNT
) {
846 memcpy(bin_buff
, &cache
[bidx
], QSFP_DUMP_CHUNK
);
847 for (iidx
= 0; iidx
< QSFP_DUMP_CHUNK
; ++iidx
) {
848 sofar
+= scnprintf(buf
+ sofar
, len
- sofar
,
849 " %02X", bin_buff
[iidx
]);
851 sofar
+= scnprintf(buf
+ sofar
, len
- sofar
, "\n");
852 bidx
+= QSFP_DUMP_CHUNK
;