2024年6月時点でカーネルバージョンがLinux-6.9.xからLinux-6.10.xになりました。
ブロックデバイスは既にLinux5.0以降よりマルチキューブロックレイヤー方式に移行し、デバイスドライバの初期化では、queueの初期設定が必須となりました。
ところが、Linux-6.10.x への移行時にqueueの初期設定をする主要な関数が廃止になりました。
SH7706ボードのSDカードドライバで使用している下記の関数がすべて廃止となりました。
--------(前略)--------
blk_queue_bounce_limit(shmmc_queue, BLK_BOUNCE_HIGH);
blk_queue_max_segments(shmmc_queue, 1);
blk_queue_segment_boundary(shmmc_queue, 0xffffffff);
blk_queue_max_hw_sectors(shmmc_queue, 1);
blk_queue_logical_block_size(shmmc_queue, MMC_BLKSIZ);
--------(後略)--------
それらのなかでblk_queue_max_hw_sectors関数とblk_queue_logical_block_size関数はデバイスドライバを正常動作させるのに必須な関数となっています。
Linuxカーネルにおけるマルチキューブロックレイヤー方式の仕様変更について調べてみたところ、実はLinux-6.9.xの期間は仕様変更における移行期間であり、その期間ですべてのブロックデバイスは仕様変更に対応していったわけです。
マルチキューブロックレイヤー方式では、queue構造体の変数に対して初期設定をするわけですが、上記の関数で設定する方式から、queue構造体のメンバであるlimits構造体メンバへの代入へと仕様変更となりました。
標準的な方法としては、limits構造体メンバに必要な値を設定しておき、ブロックデバイスを新規作成する blk_mq_alloc_disk関数の引数にlimits構造体メンバを指定することにより、queue構造体のメンバであるlimits構造体へ代入するわけです。
具体的には以下のように、limits構造体に必要な値を設定しておき、blk_mq_alloc_disk関数の第2引数でlimits構造体を指定しています。
--------(前略)--------
struct queue_limits lim = {
.max_hw_sectors = 8,
.max_sectors = 8,
.logical_block_size = MMC_BLKSIZ,
};
--------(中略)--------
shmmc_gendisk = blk_mq_alloc_disk(&tag_set, &lim, NULL);
--------(後略)--------
blk_queue_max_hw_sectors関数の引数では、1を設定していたわけですが、実は関数内部で8に変更していたため、8に設定しました。
blk_queue_logical_block_size関数の引数では、MMC_BLKSIZのため、そのまま、logical_block_sizeメンバに設定しました。