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()
129 mutex_lock(&mi->lock); in mctp_i3c_read()
130 rc = i3c_device_do_priv_xfers(mi->i3c, &xfer, 1); in mctp_i3c_read()
134 if (WARN_ON_ONCE(xfer.len > mi->mrl)) { in mctp_i3c_read()
146 addr = mi->addr << 1 | 1; in mctp_i3c_read()
160 put_unaligned_be48(mi->pid, cb->haddr); in mctp_i3c_read()
171 mutex_unlock(&mi->lock); in mctp_i3c_read()
174 mutex_unlock(&mi->lock); in mctp_i3c_read()
182 struct mctp_i3c_device *mi = i3cdev_get_drvdata(i3c); in mctp_i3c_ibi_handler() local
184 if (WARN_ON_ONCE(!mi)) in mctp_i3c_ibi_handler()
187 if (mi->have_mdb) { in mctp_i3c_ibi_handler()
201 mctp_i3c_read(mi); in mctp_i3c_ibi_handler()
204 static int mctp_i3c_setup(struct mctp_i3c_device *mi) in mctp_i3c_setup() argument
214 i3c_device_get_info(mi->i3c, &info); in mctp_i3c_setup()
215 mi->have_mdb = info.bcr & BIT(2); in mctp_i3c_setup()
216 mi->addr = info.dyn_addr; in mctp_i3c_setup()
217 mi->mwl = info.max_write_len; in mctp_i3c_setup()
218 mi->mrl = info.max_read_len; in mctp_i3c_setup()
219 mi->pid = info.pid; in mctp_i3c_setup()
221 rc = i3c_device_request_ibi(mi->i3c, &ibi); in mctp_i3c_setup()
227 dev_warn(i3cdev_to_dev(mi->i3c), in mctp_i3c_setup()
231 dev_err(i3cdev_to_dev(mi->i3c), in mctp_i3c_setup()
236 rc = i3c_device_enable_ibi(mi->i3c); in mctp_i3c_setup()
241 dev_err(i3cdev_to_dev(mi->i3c), "Failed enabling IBI (%d)\n", rc); in mctp_i3c_setup()
248 i3c_device_free_ibi(mi->i3c); in mctp_i3c_setup()
259 struct mctp_i3c_device *mi = NULL; in mctp_i3c_add_device() local
262 mi = kzalloc(sizeof(*mi), GFP_KERNEL); in mctp_i3c_add_device()
263 if (!mi) { in mctp_i3c_add_device()
267 mi->mbus = mbus; in mctp_i3c_add_device()
268 mi->i3c = i3c; in mctp_i3c_add_device()
269 mutex_init(&mi->lock); in mctp_i3c_add_device()
270 list_add(&mi->list, &mbus->devs); in mctp_i3c_add_device()
272 i3cdev_set_drvdata(i3c, mi); in mctp_i3c_add_device()
273 rc = mctp_i3c_setup(mi); in mctp_i3c_add_device()
280 list_del(&mi->list); in mctp_i3c_add_device()
281 kfree(mi); in mctp_i3c_add_device()
309 static void mctp_i3c_remove_device(struct mctp_i3c_device *mi) in mctp_i3c_remove_device() argument
313 mutex_lock(&mi->lock); in mctp_i3c_remove_device()
316 i3c_device_disable_ibi(mi->i3c); in mctp_i3c_remove_device()
317 i3c_device_free_ibi(mi->i3c); in mctp_i3c_remove_device()
320 i3cdev_set_drvdata(mi->i3c, NULL); in mctp_i3c_remove_device()
321 list_del(&mi->list); in mctp_i3c_remove_device()
324 mutex_unlock(&mi->lock); in mctp_i3c_remove_device()
325 kfree(mi); in mctp_i3c_remove_device()
330 struct mctp_i3c_device *mi = i3cdev_get_drvdata(i3c); in mctp_i3c_remove() local
333 * so mi will already be removed. in mctp_i3c_remove()
335 if (!mi) in mctp_i3c_remove()
339 mctp_i3c_remove_device(mi); in mctp_i3c_remove()
343 /* Returns the device for an address, with mi->lock held */
347 struct mctp_i3c_device *mi = NULL, *ret = NULL; in mctp_i3c_lookup() local
350 list_for_each_entry(mi, &mbus->devs, list) in mctp_i3c_lookup()
351 if (mi->pid == pid) { in mctp_i3c_lookup()
352 ret = mi; in mctp_i3c_lookup()
353 mutex_lock(&mi->lock); in mctp_i3c_lookup()
365 struct mctp_i3c_device *mi = NULL; in mctp_i3c_xmit() local
378 mi = mctp_i3c_lookup(mbus, pid); in mctp_i3c_xmit()
379 if (!mi) { in mctp_i3c_xmit()
388 if (data_len + 1 > (unsigned int)mi->mwl) { in mctp_i3c_xmit()
406 addr = mi->addr << 1; in mctp_i3c_xmit()
412 rc = i3c_device_do_priv_xfers(mi->i3c, &xfer, 1); in mctp_i3c_xmit()
421 if (mi) in mctp_i3c_xmit()
422 mutex_unlock(&mi->lock); in mctp_i3c_xmit()
480 struct mctp_i3c_device *mi = NULL, *tmp = NULL; in mctp_i3c_bus_free() local
488 list_for_each_entry_safe(mi, tmp, &mbus->devs, list) { in mctp_i3c_bus_free()
489 mctp_i3c_remove_device(mi); in mctp_i3c_bus_free()