@@ -145,8 +145,8 @@ static void *rpmsg_virtio_get_tx_buffer(struct rpmsg_virtio_device *rvdev,
145145 data = virtqueue_get_buffer (rvdev -> svq , len , idx );
146146 if (data == NULL ) {
147147 data = rpmsg_virtio_shm_pool_get_buffer (rvdev -> shpool ,
148- RPMSG_BUFFER_SIZE );
149- * len = RPMSG_BUFFER_SIZE ;
148+ rvdev -> config . rxbuf_size );
149+ * len = rvdev -> config . rxbuf_size ;
150150 }
151151 }
152152#endif /*!VIRTIO_SLAVE_ONLY*/
@@ -240,7 +240,7 @@ static int _rpmsg_virtio_get_buffer_size(struct rpmsg_virtio_device *rvdev)
240240 * If device role is Master then buffers are provided by us,
241241 * so just provide the macro.
242242 */
243- length = RPMSG_BUFFER_SIZE - sizeof (struct rpmsg_hdr );
243+ length = rvdev -> config . rxbuf_size - sizeof (struct rpmsg_hdr );
244244 }
245245#endif /*!VIRTIO_SLAVE_ONLY*/
246246
@@ -528,7 +528,10 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
528528 rvdev -> vdev = vdev ;
529529 rdev -> ns_bind_cb = ns_bind_cb ;
530530 vdev -> priv = rvdev ;
531+ rvdev -> config .txbuf_size = RPMSG_BUFFER_SIZE ;
532+ rvdev -> config .rxbuf_size = RPMSG_BUFFER_SIZE ;
531533 rdev -> ops .send_offchannel_raw = rpmsg_virtio_send_offchannel_raw ;
534+
532535 role = rpmsg_virtio_get_role (rvdev );
533536
534537#ifndef VIRTIO_MASTER_ONLY
@@ -540,6 +543,13 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
540543 vdev -> features = rpmsg_virtio_get_features (rvdev );
541544 rdev -> support_ns = !!(vdev -> features & (1 << VIRTIO_RPMSG_F_NS ));
542545
546+ if (vdev -> features & (1 << VIRTIO_RPMSG_F_BUFSZ )) {
547+ rpmsg_virtio_read_config (rvdev ,
548+ 0 ,
549+ & rvdev -> config ,
550+ sizeof (rvdev -> config ));
551+ }
552+
543553#ifndef VIRTIO_SLAVE_ONLY
544554 if (role == RPMSG_MASTER ) {
545555 /*
@@ -600,11 +610,11 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
600610 unsigned int idx ;
601611 void * buffer ;
602612
603- vqbuf .len = RPMSG_BUFFER_SIZE ;
613+ vqbuf .len = rvdev -> config . txbuf_size ;
604614 for (idx = 0 ; idx < rvdev -> rvq -> vq_nentries ; idx ++ ) {
605615 /* Initialize TX virtqueue buffers for remote device */
606616 buffer = rpmsg_virtio_shm_pool_get_buffer (shpool ,
607- RPMSG_BUFFER_SIZE );
617+ rvdev -> config . txbuf_size );
608618
609619 if (!buffer ) {
610620 return RPMSG_ERR_NO_BUFF ;
@@ -615,7 +625,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
615625 metal_io_block_set (shm_io ,
616626 metal_io_virt_to_offset (shm_io ,
617627 buffer ),
618- 0x00 , RPMSG_BUFFER_SIZE );
628+ 0x00 , rvdev -> config . txbuf_size );
619629 status =
620630 virtqueue_add_buffer (rvdev -> rvq , & vqbuf , 0 , 1 ,
621631 buffer );
0 commit comments