@@ -145,8 +145,8 @@ static void *rpmsg_virtio_get_tx_buffer(struct rpmsg_virtio_device *rvdev,
145
145
data = virtqueue_get_buffer (rvdev -> svq , len , idx );
146
146
if (!data ) {
147
147
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 ;
150
150
}
151
151
}
152
152
#endif /*!VIRTIO_SLAVE_ONLY*/
@@ -238,7 +238,7 @@ static int _rpmsg_virtio_get_buffer_size(struct rpmsg_virtio_device *rvdev)
238
238
* If device role is Master then buffers are provided by us,
239
239
* so just provide the macro.
240
240
*/
241
- length = RPMSG_BUFFER_SIZE - sizeof (struct rpmsg_hdr );
241
+ length = rvdev -> config . rxbuf_size - sizeof (struct rpmsg_hdr );
242
242
}
243
243
#endif /*!VIRTIO_SLAVE_ONLY*/
244
244
@@ -529,7 +529,10 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
529
529
rvdev -> vdev = vdev ;
530
530
rdev -> ns_bind_cb = ns_bind_cb ;
531
531
vdev -> priv = rvdev ;
532
+ rvdev -> config .txbuf_size = RPMSG_BUFFER_SIZE ;
533
+ rvdev -> config .rxbuf_size = RPMSG_BUFFER_SIZE ;
532
534
rdev -> ops .send_offchannel_raw = rpmsg_virtio_send_offchannel_raw ;
535
+
533
536
role = rpmsg_virtio_get_role (rvdev );
534
537
535
538
#ifndef VIRTIO_MASTER_ONLY
@@ -541,6 +544,13 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
541
544
vdev -> features = rpmsg_virtio_get_features (rvdev );
542
545
rdev -> support_ns = !!(vdev -> features & (1 << VIRTIO_RPMSG_F_NS ));
543
546
547
+ if (vdev -> features & (1 << VIRTIO_RPMSG_F_BUFSZ )) {
548
+ rpmsg_virtio_read_config (rvdev ,
549
+ 0 ,
550
+ & rvdev -> config ,
551
+ sizeof (rvdev -> config ));
552
+ }
553
+
544
554
#ifndef VIRTIO_SLAVE_ONLY
545
555
if (role == RPMSG_MASTER ) {
546
556
/*
@@ -601,11 +611,11 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
601
611
unsigned int idx ;
602
612
void * buffer ;
603
613
604
- vqbuf .len = RPMSG_BUFFER_SIZE ;
614
+ vqbuf .len = rvdev -> config . txbuf_size ;
605
615
for (idx = 0 ; idx < rvdev -> rvq -> vq_nentries ; idx ++ ) {
606
616
/* Initialize TX virtqueue buffers for remote device */
607
617
buffer = rpmsg_virtio_shm_pool_get_buffer (shpool ,
608
- RPMSG_BUFFER_SIZE );
618
+ rvdev -> config . txbuf_size );
609
619
610
620
if (!buffer ) {
611
621
return RPMSG_ERR_NO_BUFF ;
@@ -616,7 +626,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
616
626
metal_io_block_set (shm_io ,
617
627
metal_io_virt_to_offset (shm_io ,
618
628
buffer ),
619
- 0x00 , RPMSG_BUFFER_SIZE );
629
+ 0x00 , rvdev -> config . txbuf_size );
620
630
status =
621
631
virtqueue_add_buffer (rvdev -> rvq , & vqbuf , 0 , 1 ,
622
632
buffer );
0 commit comments