35 #include <linux/pci.h>
66 #define IPATH_EEPROM_DEV_V1 0xA0
67 #define IPATH_EEPROM_DEV_V2 0xA2
68 #define IPATH_TEMP_DEV 0x98
69 #define IPATH_BAD_DEV (IPATH_EEPROM_DEV_V2+2)
70 #define IPATH_NO_DEV (0xFF)
81 static struct i2c_chain_desc {
118 u64 out_mask, dir_mask, *gpioval;
119 unsigned long flags = 0;
143 *gpioval |= out_mask;
145 *gpioval &= ~out_mask;
147 ipath_write_kreg(dd, dd->
ipath_kregs->kr_gpio_out, *gpioval);
168 unsigned long flags = 0;
171 if (curr_statep ==
NULL) {
189 read_val = ipath_read_kreg64(dd, dd->
ipath_kregs->kr_extstatus);
223 i2c_wait_for_writes(dd);
230 i2c_wait_for_writes(dd);
241 i2c_wait_for_writes(dd);
256 ack_received = sda_in(dd, 1);
258 ack_received = sda_in(dd, 1) == 0;
275 for (bit_cntr = 7; bit_cntr >= 0; --bit_cntr) {
278 data |= sda_in(dd, 0);
296 for (bit_cntr = 7; bit_cntr >= 0; bit_cntr--) {
297 bit = (data >> bit_cntr) & 1;
302 return (!i2c_ackrcv(dd)) ? 1 : 0;
331 res = wr_byte(dd, offset_dir);
361 int clock_cycles_left = 9;
369 *gpioval = ipath_read_kreg64(dd, dd->
ipath_kregs->kr_gpio_out);
373 "is %llx\n", (
unsigned long long) *gpioval);
384 while (clock_cycles_left--) {
416 ret = eeprom_reset(dd);
426 ret = i2c_startcmd(dd, devaddr |
READ_CMD);
453 static struct i2c_chain_desc *ipath_i2c_type(
struct ipath_devdata *dd)
459 if (idx >= 0 && idx < (
ARRAY_SIZE(i2c_chains) - 1))
465 if (!i2c_probe(dd, i2c_chains[idx].probe_dev))
482 return (idx >= 0) ? i2c_chains + idx :
NULL;
485 static int ipath_eeprom_internal_read(
struct ipath_devdata *dd,
489 struct i2c_chain_desc *icd;
493 icd = ipath_i2c_type(dd);
500 eeprom_offset = (eeprom_offset << 1) |
READ_CMD;
501 ret = i2c_startcmd(dd, eeprom_offset);
505 if (i2c_startcmd(dd, icd->eeprom_dev |
WRITE_CMD)) {
511 ret = wr_byte(dd, eeprom_offset);
518 ret = i2c_startcmd(dd, icd->eeprom_dev |
READ_CMD);
521 ipath_dbg(
"Failed startcmd for dev %02X\n", icd->eeprom_dev);
547 static int ipath_eeprom_internal_write(
struct ipath_devdata *dd,
u8 eeprom_offset,
548 const void *buffer,
int len)
552 int max_wait_time,
i;
554 struct i2c_chain_desc *icd;
557 icd = ipath_i2c_type(dd);
565 ipath_dbg(
"Failed to start cmd offset %u\n",
571 if (i2c_startcmd(dd, icd->eeprom_dev |
WRITE_CMD)) {
575 ret = wr_byte(dd, eeprom_offset);
583 sub_len =
min(len, 4);
584 eeprom_offset += sub_len;
587 for (i = 0; i < sub_len; i++) {
588 if (wr_byte(dd, *bp++)) {
590 "total remain)\n", i, sub_len,
610 while (i2c_startcmd(dd, icd->eeprom_dev |
READ_CMD)) {
612 if (!--max_wait_time) {
613 ipath_dbg(
"Did not get successful read to "
648 ret = ipath_eeprom_internal_read(dd, eeprom_offset, buff, len);
663 const void *buff,
int len)
669 ret = ipath_eeprom_internal_write(dd, eeprom_offset, buff, len);
723 if (oguid > bguid[7]) {
724 if (bguid[6] == 0xff) {
725 if (bguid[5] == 0xff) {
728 "Can't set %s GUID from "
729 "base, wraps to OUI!\n",
740 ipath_dbg(
"nguid %u, so adding %u to device 0 guid, "
755 "bytes from eeprom for GUID\n", len);
760 eep_stat = ipath_eeprom_internal_read(dd, 0, buf, len);
769 csum = flash_csum(ifp, 0);
772 "0x%x, not 0x%x\n", csum, ifp->
if_csum);
779 *(
unsigned long long *) ifp->
if_guid);
785 if (*(
u64 *) ifp->
if_guid == 0x100007511000000ULL)
787 "default, probably not correct!\n",
788 *(
unsigned long long *) ifp->
if_guid);
791 if (!bguid[0] && !bguid[1] && !bguid[2]) {
798 bguid[3] = bguid[4] = 0;
801 "shifting 2 octets\n");
885 if (ret == 0 && new_time < 3600)
899 "bytes from eeprom for logging\n", len);
911 ret = ipath_eeprom_internal_read(dd, 0, buf, len);
919 csum = flash_csum(ifp, 0);
963 if (new_time >= 3600) {
964 new_hrs = new_time / 3600;
967 if (new_hrs > 0xFFFF)
988 csum = flash_csum(ifp, 1);
989 ret = ipath_eeprom_internal_write(dd, 0, buf, hi_water + 1);
1018 unsigned long flags;
1029 static int ipath_tempsense_internal_read(
struct ipath_devdata *dd,
u8 regnum)
1032 struct i2c_chain_desc *icd;
1036 icd = ipath_i2c_type(dd);
1046 if (i2c_startcmd(dd, icd->temp_dev |
WRITE_CMD)) {
1047 ipath_dbg(
"Failed tempsense startcmd\n");
1052 ret = wr_byte(dd, regnum);
1060 if (i2c_startcmd(dd, icd->temp_dev |
READ_CMD)) {
1061 ipath_dbg(
"Failed tempsense RD startcmd\n");
1076 #define VALID_TS_RD_REG_MASK 0xBF
1098 ret = ipath_tempsense_internal_read(dd, regnum);
1111 static int ipath_tempsense_internal_write(
struct ipath_devdata *dd,
1115 struct i2c_chain_desc *icd;
1117 icd = ipath_i2c_type(dd);
1126 if (i2c_startcmd(dd, icd->temp_dev |
WRITE_CMD)) {
1127 ipath_dbg(
"Failed tempsense startcmd\n");
1132 ret = wr_byte(dd, regnum);
1135 ipath_dev_err(dd,
"Failed to write tempsense command %02X\n",
1140 ret = wr_byte(dd, data);
1142 ret = i2c_startcmd(dd, icd->temp_dev |
READ_CMD);
1153 #define VALID_TS_WR_REG_MASK ((1 << 9) | (1 << 0xB) | (1 << 0xD))
1172 ret = ipath_tempsense_internal_write(dd, regnum, data);