• Home
  • Raw
  • Download

Lines Matching +full:bus +full:- +full:addr

24  *  - Redistributions of source code must retain the above copyright
26 * - Redistributions in binary form must reproduce the above copyright
30 * - Neither the name of Intel Corporation nor the names of its
54 /* for the given bus number, return the CSR for reading an i2c line */
60 /* for the given bus number, return the CSR for writing an i2c line */
68 struct hfi1_i2c_bus *bus = (struct hfi1_i2c_bus *)data; in hfi1_setsda() local
69 struct hfi1_devdata *dd = bus->controlling_dd; in hfi1_setsda()
73 target_oe = i2c_oe_csr(bus->num); in hfi1_setsda()
92 struct hfi1_i2c_bus *bus = (struct hfi1_i2c_bus *)data; in hfi1_setscl() local
93 struct hfi1_devdata *dd = bus->controlling_dd; in hfi1_setscl()
97 target_oe = i2c_oe_csr(bus->num); in hfi1_setscl()
116 struct hfi1_i2c_bus *bus = (struct hfi1_i2c_bus *)data; in hfi1_getsda() local
123 target_in = i2c_in_csr(bus->num); in hfi1_getsda()
124 reg = read_csr(bus->controlling_dd, target_in); in hfi1_getsda()
130 struct hfi1_i2c_bus *bus = (struct hfi1_i2c_bus *)data; in hfi1_getscl() local
137 target_in = i2c_in_csr(bus->num); in hfi1_getscl()
138 reg = read_csr(bus->controlling_dd, target_in); in hfi1_getscl()
143 * Allocate and initialize the given i2c bus number.
149 struct hfi1_i2c_bus *bus; in init_i2c_bus() local
152 bus = kzalloc(sizeof(*bus), GFP_KERNEL); in init_i2c_bus()
153 if (!bus) in init_i2c_bus()
156 bus->controlling_dd = dd; in init_i2c_bus()
157 bus->num = num; /* our bus number */ in init_i2c_bus()
159 bus->algo.setsda = hfi1_setsda; in init_i2c_bus()
160 bus->algo.setscl = hfi1_setscl; in init_i2c_bus()
161 bus->algo.getsda = hfi1_getsda; in init_i2c_bus()
162 bus->algo.getscl = hfi1_getscl; in init_i2c_bus()
163 bus->algo.udelay = 5; in init_i2c_bus()
164 bus->algo.timeout = usecs_to_jiffies(100000); in init_i2c_bus()
165 bus->algo.data = bus; in init_i2c_bus()
167 bus->adapter.owner = THIS_MODULE; in init_i2c_bus()
168 bus->adapter.algo_data = &bus->algo; in init_i2c_bus()
169 bus->adapter.dev.parent = &dd->pcidev->dev; in init_i2c_bus()
170 snprintf(bus->adapter.name, sizeof(bus->adapter.name), in init_i2c_bus()
173 ret = i2c_bit_add_bus(&bus->adapter); in init_i2c_bus()
175 dd_dev_info(dd, "%s: unable to add i2c bus %d, err %d\n", in init_i2c_bus()
177 kfree(bus); in init_i2c_bus()
181 return bus; in init_i2c_bus()
186 * Return 0 on success, -errno on error.
190 ad->i2c_bus0 = init_i2c_bus(dd, ad, 0); in set_up_i2c()
191 ad->i2c_bus1 = init_i2c_bus(dd, ad, 1); in set_up_i2c()
192 if (!ad->i2c_bus0 || !ad->i2c_bus1) in set_up_i2c()
193 return -ENOMEM; in set_up_i2c()
197 static void clean_i2c_bus(struct hfi1_i2c_bus *bus) in clean_i2c_bus() argument
199 if (bus) { in clean_i2c_bus()
200 i2c_del_adapter(&bus->adapter); in clean_i2c_bus()
201 kfree(bus); in clean_i2c_bus()
209 clean_i2c_bus(ad->i2c_bus0); in clean_up_i2c()
210 ad->i2c_bus0 = NULL; in clean_up_i2c()
211 clean_i2c_bus(ad->i2c_bus1); in clean_up_i2c()
212 ad->i2c_bus1 = NULL; in clean_up_i2c()
227 msgs[0].addr = slave_addr; in i2c_bus_write()
239 msgs[0].addr = slave_addr; in i2c_bus_write()
244 msgs[1].addr = slave_addr; in i2c_bus_write()
250 return -EINVAL; in i2c_bus_write()
253 i2c->controlling_dd = dd; in i2c_bus_write()
254 ret = i2c_transfer(&i2c->adapter, msgs, num_msgs); in i2c_bus_write()
256 dd_dev_err(dd, "%s: bus %d, i2c slave 0x%x, offset 0x%x, len 0x%x; write failed, ret %d\n", in i2c_bus_write()
257 __func__, i2c->num, slave_addr, offset, len, ret); in i2c_bus_write()
258 return ret < 0 ? ret : -EIO; in i2c_bus_write()
263 static int i2c_bus_read(struct hfi1_devdata *dd, struct hfi1_i2c_bus *bus, in i2c_bus_read() argument
275 msgs[0].addr = slave_addr; in i2c_bus_read()
287 msgs[0].addr = slave_addr; in i2c_bus_read()
292 msgs[1].addr = slave_addr; in i2c_bus_read()
298 return -EINVAL; in i2c_bus_read()
301 bus->controlling_dd = dd; in i2c_bus_read()
302 ret = i2c_transfer(&bus->adapter, msgs, num_msgs); in i2c_bus_read()
304 dd_dev_err(dd, "%s: bus %d, i2c slave 0x%x, offset 0x%x, len 0x%x; read failed, ret %d\n", in i2c_bus_read()
305 __func__, bus->num, slave_addr, offset, len, ret); in i2c_bus_read()
306 return ret < 0 ? ret : -EIO; in i2c_bus_read()
312 * Raw i2c write. No set-up or lock checking.
314 * Return 0 on success, -errno on error.
319 struct hfi1_devdata *dd = ppd->dd; in __i2c_write()
320 struct hfi1_i2c_bus *bus; in __i2c_write() local
324 bus = target ? dd->asic_data->i2c_bus1 : dd->asic_data->i2c_bus0; in __i2c_write()
325 slave_addr = (i2c_addr & 0xff) >> 1; /* convert to 7-bit addr */ in __i2c_write()
327 return i2c_bus_write(dd, bus, slave_addr, offset, offset_size, bp, len); in __i2c_write()
333 * Return number of bytes written, or -errno.
340 if (!check_chip_resource(ppd->dd, i2c_target(target), __func__)) in i2c_write()
341 return -EACCES; in i2c_write()
351 * Raw i2c read. No set-up or lock checking.
353 * Return 0 on success, -errno on error.
358 struct hfi1_devdata *dd = ppd->dd; in __i2c_read()
359 struct hfi1_i2c_bus *bus; in __i2c_read() local
363 bus = target ? dd->asic_data->i2c_bus1 : dd->asic_data->i2c_bus0; in __i2c_read()
364 slave_addr = (i2c_addr & 0xff) >> 1; /* convert to 7-bit addr */ in __i2c_read()
366 return i2c_bus_read(dd, bus, slave_addr, offset, offset_size, bp, len); in __i2c_read()
372 * Return number of bytes read, or -errno.
379 if (!check_chip_resource(ppd->dd, i2c_target(target), __func__)) in i2c_read()
380 return -EACCES; in i2c_read()
391 * by writing @addr = ((256 * n) + m)
395 * Return number of bytes written or -errno.
397 int qsfp_write(struct hfi1_pportdata *ppd, u32 target, int addr, void *bp, in qsfp_write() argument
406 if (!check_chip_resource(ppd->dd, i2c_target(target), __func__)) in qsfp_write()
407 return -EACCES; in qsfp_write()
411 * Set the qsfp page based on a zero-based address in qsfp_write()
414 page = (u8)(addr / QSFP_PAGESIZE); in qsfp_write()
418 /* QSFPs require a 5-10msec delay after write operations */ in qsfp_write()
421 hfi1_dev_porterr(ppd->dd, ppd->port, in qsfp_write()
427 offset = addr % QSFP_PAGESIZE; in qsfp_write()
428 nwrite = len - count; in qsfp_write()
430 if (((addr % QSFP_RW_BOUNDARY) + nwrite) > QSFP_RW_BOUNDARY) in qsfp_write()
431 nwrite = QSFP_RW_BOUNDARY - (addr % QSFP_RW_BOUNDARY); in qsfp_write()
435 /* QSFPs require a 5-10msec delay after write operations */ in qsfp_write()
441 addr += nwrite; in qsfp_write()
450 * Perform a stand-alone single QSFP write. Acquire the resource, do the
453 int one_qsfp_write(struct hfi1_pportdata *ppd, u32 target, int addr, void *bp, in one_qsfp_write() argument
456 struct hfi1_devdata *dd = ppd->dd; in one_qsfp_write()
463 ret = qsfp_write(ppd, target, addr, bp, len); in one_qsfp_write()
471 * by reading @addr = ((256 * n) + m)
475 * Return the number of bytes read or -errno.
477 int qsfp_read(struct hfi1_pportdata *ppd, u32 target, int addr, void *bp, in qsfp_read() argument
486 if (!check_chip_resource(ppd->dd, i2c_target(target), __func__)) in qsfp_read()
487 return -EACCES; in qsfp_read()
491 * Set the qsfp page based on a zero-based address in qsfp_read()
494 page = (u8)(addr / QSFP_PAGESIZE); in qsfp_read()
497 /* QSFPs require a 5-10msec delay after write operations */ in qsfp_read()
500 hfi1_dev_porterr(ppd->dd, ppd->port, in qsfp_read()
506 offset = addr % QSFP_PAGESIZE; in qsfp_read()
507 nread = len - count; in qsfp_read()
509 if (((addr % QSFP_RW_BOUNDARY) + nread) > QSFP_RW_BOUNDARY) in qsfp_read()
510 nread = QSFP_RW_BOUNDARY - (addr % QSFP_RW_BOUNDARY); in qsfp_read()
518 addr += nread; in qsfp_read()
527 * Perform a stand-alone single QSFP read. Acquire the resource, do the
530 int one_qsfp_read(struct hfi1_pportdata *ppd, u32 target, int addr, void *bp, in one_qsfp_read() argument
533 struct hfi1_devdata *dd = ppd->dd; in one_qsfp_read()
540 ret = qsfp_read(ppd, target, addr, bp, len); in one_qsfp_read()
560 u32 target = ppd->dd->hfi1_id; in refresh_qsfp_cache()
563 u8 *cache = &cp->cache[0]; in refresh_qsfp_cache()
567 spin_lock_irqsave(&ppd->qsfp_info.qsfp_lock, flags); in refresh_qsfp_cache()
568 ppd->qsfp_info.cache_valid = 0; in refresh_qsfp_cache()
569 spin_unlock_irqrestore(&ppd->qsfp_info.qsfp_lock, flags); in refresh_qsfp_cache()
572 ret = -ENODEV; in refresh_qsfp_cache()
578 dd_dev_info(ppd->dd, in refresh_qsfp_cache()
591 dd_dev_info(ppd->dd, "%s failed\n", __func__); in refresh_qsfp_cache()
596 dd_dev_info(ppd->dd, "%s failed\n", __func__); in refresh_qsfp_cache()
601 dd_dev_info(ppd->dd, "%s failed\n", __func__); in refresh_qsfp_cache()
608 dd_dev_info(ppd->dd, "%s failed\n", __func__); in refresh_qsfp_cache()
613 dd_dev_info(ppd->dd, "%s failed\n", __func__); in refresh_qsfp_cache()
620 dd_dev_info(ppd->dd, "%s failed\n", __func__); in refresh_qsfp_cache()
625 dd_dev_info(ppd->dd, "%s failed\n", __func__); in refresh_qsfp_cache()
632 dd_dev_info(ppd->dd, "%s failed\n", __func__); in refresh_qsfp_cache()
638 spin_lock_irqsave(&ppd->qsfp_info.qsfp_lock, flags); in refresh_qsfp_cache()
639 ppd->qsfp_info.cache_valid = 1; in refresh_qsfp_cache()
640 ppd->qsfp_info.cache_refresh_required = 0; in refresh_qsfp_cache()
641 spin_unlock_irqrestore(&ppd->qsfp_info.qsfp_lock, flags); in refresh_qsfp_cache()
676 * balance to the off-by-1 offset above, we add 4 here to in get_qsfp_power_class()
685 struct hfi1_devdata *dd = ppd->dd; in qsfp_mod_present()
688 reg = read_csr(dd, dd->hfi1_id ? ASIC_QSFP2_IN : ASIC_QSFP1_IN); in qsfp_mod_present()
696 * For addr 000-127, lower page 00h
697 * For addr 128-255, upper page 00h
698 * For addr 256-383, upper page 01h
699 * For addr 384-511, upper page 02h
700 * For addr 512-639, upper page 03h
707 int get_cable_info(struct hfi1_devdata *dd, u32 port_num, u32 addr, u32 len, in get_cable_info() argument
714 if (port_num > dd->num_pports || port_num < 1) { in get_cable_info()
717 ret = -EINVAL; in get_cable_info()
721 ppd = dd->pport + (port_num - 1); in get_cable_info()
723 ret = -ENODEV; in get_cable_info()
727 if (!ppd->qsfp_info.cache_valid) { in get_cable_info()
728 ret = -EINVAL; in get_cable_info()
732 if (addr >= (QSFP_MAX_NUM_PAGES * 128)) { in get_cable_info()
733 ret = -ERANGE; in get_cable_info()
737 if ((addr + len) > (QSFP_MAX_NUM_PAGES * 128)) { in get_cable_info()
738 excess_len = (addr + len) - (QSFP_MAX_NUM_PAGES * 128); in get_cable_info()
739 memcpy(data, &ppd->qsfp_info.cache[addr], (len - excess_len)); in get_cable_info()
740 data += (len - excess_len); in get_cable_info()
744 memcpy(data, &ppd->qsfp_info.cache[addr], len); in get_cable_info()
746 if (addr <= QSFP_MONITOR_VAL_END && in get_cable_info()
747 (addr + len) >= QSFP_MONITOR_VAL_START) { in get_cable_info()
749 if (addr < QSFP_MONITOR_VAL_START) { in get_cable_info()
750 if (addr + len <= QSFP_MONITOR_VAL_END) in get_cable_info()
751 len = addr + len - QSFP_MONITOR_VAL_START; in get_cable_info()
754 offset = QSFP_MONITOR_VAL_START - addr; in get_cable_info()
755 addr = QSFP_MONITOR_VAL_START; in get_cable_info()
756 } else if (addr == QSFP_MONITOR_VAL_START) { in get_cable_info()
758 if (addr + len > QSFP_MONITOR_VAL_END) in get_cable_info()
762 if (addr + len > QSFP_MONITOR_VAL_END) in get_cable_info()
763 len = QSFP_MONITOR_VAL_END - addr + 1; in get_cable_info()
766 ret = one_qsfp_read(ppd, dd->hfi1_id, addr, data + offset, len); in get_cable_info()
768 ret = -EAGAIN; in get_cable_info()
792 u8 *cache = &ppd->qsfp_info.cache[0]; in qsfp_dump()
805 if (ppd->qsfp_info.cache_valid) { in qsfp_dump()
811 sofar += scnprintf(buf + sofar, len - sofar, "PWR:%.3sW\n", in qsfp_dump()
814 sofar += scnprintf(buf + sofar, len - sofar, "TECH:%s%s\n", in qsfp_dump()
818 sofar += scnprintf(buf + sofar, len - sofar, "Vendor:%.*s\n", in qsfp_dump()
821 sofar += scnprintf(buf + sofar, len - sofar, "OUI:%06X\n", in qsfp_dump()
824 sofar += scnprintf(buf + sofar, len - sofar, "Part#:%.*s\n", in qsfp_dump()
827 sofar += scnprintf(buf + sofar, len - sofar, "Rev:%.*s\n", in qsfp_dump()
831 sofar += scnprintf(buf + sofar, len - sofar, in qsfp_dump()
836 sofar += scnprintf(buf + sofar, len - sofar, "Serial:%.*s\n", in qsfp_dump()
839 sofar += scnprintf(buf + sofar, len - sofar, "Date:%.*s\n", in qsfp_dump()
842 sofar += scnprintf(buf + sofar, len - sofar, "Lot:%.*s\n", in qsfp_dump()
850 sofar += scnprintf(buf + sofar, len - sofar, in qsfp_dump()
853 sofar += scnprintf(buf + sofar, len - sofar, "\n"); in qsfp_dump()