Lines Matching full:mi

100 static int mctp_i3c_read(struct mctp_i3c_device *mi)  in mctp_i3c_read()  argument
102 struct i3c_priv_xfer xfer = { .rnw = 1, .len = mi->mrl }; in mctp_i3c_read()
103 struct net_device_stats *stats = &mi->mbus->ndev->stats; in mctp_i3c_read()
110 skb = netdev_alloc_skb(mi->mbus->ndev, in mctp_i3c_read()
111 mi->mrl + sizeof(struct mctp_i3c_internal_hdr)); in mctp_i3c_read()
122 put_unaligned_be48(mi->pid, ihdr->source); in mctp_i3c_read()
123 put_unaligned_be48(mi->mbus->pid, ihdr->dest); in mctp_i3c_read()
126 xfer.data.in = skb_put(skb, mi->mrl); in mctp_i3c_read()
128 rc = i3c_device_do_priv_xfers(mi->i3c, &xfer, 1); in mctp_i3c_read()
132 if (WARN_ON_ONCE(xfer.len > mi->mrl)) { in mctp_i3c_read()
144 addr = mi->addr << 1 | 1; in mctp_i3c_read()
158 put_unaligned_be48(mi->pid, cb->haddr); in mctp_i3c_read()
178 struct mctp_i3c_device *mi = i3cdev_get_drvdata(i3c); in mctp_i3c_ibi_handler() local
180 if (WARN_ON_ONCE(!mi)) in mctp_i3c_ibi_handler()
183 if (mi->have_mdb) { in mctp_i3c_ibi_handler()
197 mctp_i3c_read(mi); in mctp_i3c_ibi_handler()
200 static int mctp_i3c_setup(struct mctp_i3c_device *mi) in mctp_i3c_setup() argument
210 i3c_device_get_info(mi->i3c, &info); in mctp_i3c_setup()
211 mi->have_mdb = info.bcr & BIT(2); in mctp_i3c_setup()
212 mi->addr = info.dyn_addr; in mctp_i3c_setup()
213 mi->mwl = info.max_write_len; in mctp_i3c_setup()
214 mi->mrl = info.max_read_len; in mctp_i3c_setup()
215 mi->pid = info.pid; in mctp_i3c_setup()
217 rc = i3c_device_request_ibi(mi->i3c, &ibi); in mctp_i3c_setup()
223 dev_warn(i3cdev_to_dev(mi->i3c), in mctp_i3c_setup()
227 dev_err(i3cdev_to_dev(mi->i3c), in mctp_i3c_setup()
232 rc = i3c_device_enable_ibi(mi->i3c); in mctp_i3c_setup()
237 dev_err(i3cdev_to_dev(mi->i3c), "Failed enabling IBI (%d)\n", rc); in mctp_i3c_setup()
244 i3c_device_free_ibi(mi->i3c); in mctp_i3c_setup()
255 struct mctp_i3c_device *mi = NULL; in mctp_i3c_add_device() local
258 mi = kzalloc(sizeof(*mi), GFP_KERNEL); in mctp_i3c_add_device()
259 if (!mi) { in mctp_i3c_add_device()
263 mi->mbus = mbus; in mctp_i3c_add_device()
264 mi->i3c = i3c; in mctp_i3c_add_device()
265 mutex_init(&mi->lock); in mctp_i3c_add_device()
266 list_add(&mi->list, &mbus->devs); in mctp_i3c_add_device()
268 i3cdev_set_drvdata(i3c, mi); in mctp_i3c_add_device()
269 rc = mctp_i3c_setup(mi); in mctp_i3c_add_device()
276 list_del(&mi->list); in mctp_i3c_add_device()
277 kfree(mi); in mctp_i3c_add_device()
305 static void mctp_i3c_remove_device(struct mctp_i3c_device *mi) in mctp_i3c_remove_device() argument
309 mutex_lock(&mi->lock); in mctp_i3c_remove_device()
312 i3c_device_disable_ibi(mi->i3c); in mctp_i3c_remove_device()
313 i3c_device_free_ibi(mi->i3c); in mctp_i3c_remove_device()
316 i3cdev_set_drvdata(mi->i3c, NULL); in mctp_i3c_remove_device()
317 list_del(&mi->list); in mctp_i3c_remove_device()
320 mutex_unlock(&mi->lock); in mctp_i3c_remove_device()
321 kfree(mi); in mctp_i3c_remove_device()
326 struct mctp_i3c_device *mi = i3cdev_get_drvdata(i3c); in mctp_i3c_remove() local
329 * so mi will already be removed. in mctp_i3c_remove()
331 if (!mi) in mctp_i3c_remove()
335 mctp_i3c_remove_device(mi); in mctp_i3c_remove()
339 /* Returns the device for an address, with mi->lock held */
343 struct mctp_i3c_device *mi = NULL, *ret = NULL; in mctp_i3c_lookup() local
346 list_for_each_entry(mi, &mbus->devs, list) in mctp_i3c_lookup()
347 if (mi->pid == pid) { in mctp_i3c_lookup()
348 ret = mi; in mctp_i3c_lookup()
349 mutex_lock(&mi->lock); in mctp_i3c_lookup()
361 struct mctp_i3c_device *mi = NULL; in mctp_i3c_xmit() local
374 mi = mctp_i3c_lookup(mbus, pid); in mctp_i3c_xmit()
375 if (!mi) { in mctp_i3c_xmit()
384 if (data_len + 1 > (unsigned int)mi->mwl) { in mctp_i3c_xmit()
402 addr = mi->addr << 1; in mctp_i3c_xmit()
408 rc = i3c_device_do_priv_xfers(mi->i3c, &xfer, 1); in mctp_i3c_xmit()
417 if (mi) in mctp_i3c_xmit()
418 mutex_unlock(&mi->lock); in mctp_i3c_xmit()
476 struct mctp_i3c_device *mi = NULL, *tmp = NULL; in mctp_i3c_bus_free() local
484 list_for_each_entry_safe(mi, tmp, &mbus->devs, list) { in mctp_i3c_bus_free()
485 mctp_i3c_remove_device(mi); in mctp_i3c_bus_free()