[hatari-devel] SCSI Driver improvements patch |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/hatari-devel Archives
]
- To: hatari-devel@xxxxxxxxxxxxxxxxxxx
- Subject: [hatari-devel] SCSI Driver improvements patch
- From: Uwe Seimet <Uwe.Seimet@xxxxxxxxx>
- Date: Wed, 4 Dec 2024 10:38:35 +0100
- Arc-authentication-results: i=3; strato.com; arc=fail (i=2) (Body hash did not verify); dkim=fail header.d="seimet.de" header.s="strato-dkim-0003" header.a="ed25519-sha256" reason="Body hash did not verify"; dkim=fail header.d="seimet.de" header.s="strato-dkim-0002" header.a="rsa-sha256" reason="Body hash did not verify"
- Arc-authentication-results: i=2; strato.com; dmarc=none header.from="seimet.de"; arc=pass (i=1) smtp.remote-ip=81.169.146.220; dkim=pass header.d="seimet.de" header.s="strato-dkim-0003" header.a="ed25519-sha256"; dkim=pass header.d="seimet.de" header.s="strato-dkim-0002" header.a="rsa-sha256"; dkim-adsp=pass; spf=pass smtp.mailfrom="Uwe.Seimet@xxxxxxxxx"
- Arc-authentication-results: i=1; strato.com; arc=none; dkim=none
- Arc-message-signature: i=3; a=rsa-sha256; c=relaxed/relaxed; t=1733864794; s=strato-dkim-0002; d=strato.com; h=Message-ID:Subject:To:From:Date:Resent-To:Resent-Date:Resent-From: Cc:Date:From:Subject:Sender; bh=ZNK7DwA4/0Gc6nle+KbfGxRQlYFRlVFuw/G9K2Diwic=; b=lmpXyJqE6NPTATHCPFa4u5QkzlZd9UC97G3PZkvTrRHmSGOmaRDH6WUn63i8x6h45P /rEwnGtSFhh49oP2dlUtVf08BYeQeSUpXbcbEwUvMdRy5U0HHg+fIg++7NabufGTg/ec Uj1rzlu6giatQeKwWLGl4K93207rHLgg7qyWi9giBOjqrwX5u0P+U4z2qInHTvDvDF37 xEJwcjnmk91oOjM62+/VyJQkGNrkwswn94Ibrmfr/qyIVQAjzzoJ/kZjkpRfEbSeCE6q P7xm5v4toYbHNzJnTtVDCYU2RWHVIGti+pXj1Qzlq6CDXRodxVYJ0tZVsVdRfD0UxIjL 3gSw==
- Arc-message-signature: i=2; a=rsa-sha256; c=relaxed/relaxed; t=1733305134; s=strato-dkim-0002; d=strato.com; h=Message-ID:Subject:To:From:Date:Cc:Date:From:Subject:Sender; bh=L6XERutd2lPHlqsYQOG/GMhaEx7u2iOXcSNb0dxHK0k=; b=TUjYAn0umHCTcaqBBzEpQV5a5VKbQ/BpWn6c/wwTahqdEPee6X8Sgect5+YVdCDmXY aaIdfS1jMwJiZFtE/NUlEdocoMpD11SiTP8S/hUZPblvTZUjVz+YiGofChou7BqkTOyT Rp3JyPzgqEKwFzHpWEOaRXHYtmEul5nWNwnkvfvfFuOL68e72Y8UPwxi3QZZe+DOaF+/ nLuptpfGoAf23gDsNIoPYPJGoFgokvdANTcqVGNjz/MsABszj5NJHhi/YfXNY/qzGopK pRb4W2kIwOFL77hLXKZe88JfXB4SN01L93WU9cZ4MKFt2Q9iwAE3FHOgwRniTsF5ldZJ DFug==
- Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; t=1733305133; s=strato-dkim-0002; d=strato.com; h=Message-ID:Subject:To:From:Date:Cc:Date:From:Subject:Sender; bh=L6XERutd2lPHlqsYQOG/GMhaEx7u2iOXcSNb0dxHK0k=; b=J/1rlI0anYvBrjtB3Ro/DuXGrw+2WLjgOlExqFeBWTYTKMSPckRx3HrGBdM14VGKQj oWbru8C+qgXnmf3rV8Au5x1NSLBHIT5mcRzAtYqLlIZs8Bu1ldc/k/Cn7twHTIk3sAiX lCny/Da7SGtgJH+LIl6itW1BJLMfVKCrgsPQ1/sVERzbLD7n8Az+12T/UgvCUOoKG+64 X1m5pwfmSsvJh/78LE+rA+C27TUIUSo+lKrQDZX0uXM3L5gDaGD7SrJDSPxHuNb7+A/j UIfrxy1ytbAf0eYL8AGUVCsqbfLC+SWZht/cbCUH/IuMkTxA3fRNGihxWUls8sP1sav0 T/2A==
- Arc-seal: i=3; a=rsa-sha256; t=1733864794; cv=fail; d=strato.com; s=strato-dkim-0002; b=ciKIee2/ik8Yxma+AHDXWTjmmAnk4LWMtElAjJgXZJMoY8bafBU/xAmFD4VSEnpPI4 zmyRBfn7QvfEzOArmC6ELSGAshCCvpcznVwFec1df2oFM0L5YZHznBGkc4arCdxH6UmQ mfHgqHGJa+Tcupg+voz6J5o905lFd8HtZQlwqEjYWzBl5q5h7jAxXr1WJ+hzhd5XhhO6 K9rY1GREypBSwkP18YmgMVWi2PfZbaJgZvys9B1cvO9pb2EeQdIoOZQjo6cfCWUJ6sH9 /F5fmMb9ZsFpXJuWBrFfN3UjbqcPAINWPZA7gJAJiyFGLH+9v6Qh8PDu/xW3oRJH4knf LGtA==
- Arc-seal: i=2; a=rsa-sha256; t=1733305134; cv=pass; d=strato.com; s=strato-dkim-0002; b=iGJc5+gxlFHNcHtfjfGB1jnAfw+aebfc5CuKSSVJvsfD8CZyaxHRnS3c1nEPPttqsk c3zHWhmI+UjdJ4FRkmBl1Sx28KzvYbkrKi5mBUk+cdyTK3W1C0UFzvewV5Ua2GWuq9Hr jZD39IYpTRWdL8fJHCvv9K4QkyV9imN4932JVeuaJ/S/F2k4zgoLJAKYIe6Q/N1datnS BLN8PcRODAUD0X4ez7Od8M96wEmkw1elkX58acSTbzDGkUL1gT421hPTY5NbHNIXZbHz Tbn1wb99cP4I4T++Xx7HNNpw19Nb3lLe0+OKisyHVxFqEtgUY/TseGqZhD3CEDZ7N65t IERg==
- Arc-seal: i=1; a=rsa-sha256; t=1733305133; cv=none; d=strato.com; s=strato-dkim-0002; b=eMf2zMrh7oFM+w1sbLO3x53w/sqS96h6rucnQhkqE9szxIUUOsPN4wRGONO6NK1Gta MEBQ7qhDgm6vw8Q91c92WT+5mMGXJNEl1BdOStiSarZULqWwUqcxp1b8Geq5/FHmeN4D +O9ZIVI7AngifvDKa/a3bxlrHaYM6RPF4mFj17hH/bOoXJGDB4RFfrHylSLcGdTEFZsr kf2zqbC8X1Kb+pn1z6cuGwb36Tw3aTU31uekD5157/1+wXs4nAindE2wIgp7OXIk7IVh xuKUOw9nuDExCymmN5Xzi5KFaL+4kMeXMncGgKobkvctvOBCF2EtTZ84cyiiInNvdCya kF3w==
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1733864794; s=strato-dkim-0002; d=seimet.de; h=Message-ID:Subject:To:From:Date:Resent-To:Resent-Date:Resent-From: Cc:Date:From:Subject:Sender; bh=ZNK7DwA4/0Gc6nle+KbfGxRQlYFRlVFuw/G9K2Diwic=; b=H6BrNJBny25caHsDbZYBIE3B4IxyCs5Q8SEHNMA5J6Co1sdyhh/yfRWJDye01goAsU V1z8zEjYbKKri49Rf5QAeTd8y4SFmE8HQbZ6UuJbrjJzn9Yd7qD31b/iHZE2EI/F8ILG osdyQit8ZJOvDuWh78/fXxIFGODb1YrLcS70m8Abwly3v2l3aAhvTcFCWmsoYg1ThPRf xRVQNShmh4+M2cEWUdWk8Lu6a6aJeXDO1/wp+KVHWkaWJvEI8EDuWQq6gKmUsRA5ywe8 qWen8+K7fBkNx82or0/M0ouW8pCWg5CzbVh2OVegeLj52Tprix/oUK0hWVf+FuMN4CL5 u7jA==
- Dkim-signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1733864794; s=strato-dkim-0003; d=seimet.de; h=Message-ID:Subject:To:From:Date:Resent-To:Resent-Date:Resent-From: Cc:Date:From:Subject:Sender; bh=ZNK7DwA4/0Gc6nle+KbfGxRQlYFRlVFuw/G9K2Diwic=; b=H9yhtj6h2OawThf1wanT5dRmttHCWCx3oov1oZOtlYmVfBuKOS4EUrSNWF5Y2tAL4r Pa7HhcAmaHJ6fCMMxxAA==
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1733305133; s=strato-dkim-0002; d=seimet.de; h=Message-ID:Subject:To:From:Date:Cc:Date:From:Subject:Sender; bh=L6XERutd2lPHlqsYQOG/GMhaEx7u2iOXcSNb0dxHK0k=; b=M+AyUbA+X4BR48yEkQDAJZ+7AdsIOTE+/GesTWjFnEwmMStK9wLHvS38jJ82xzRzST yeH5lDLSzBH79cFixPUvw0B+AEpQXQcofpnGRLcviF7oiAxse/6DCqAgqSQC+ZR/E1Ts WwkO3/DXOG+joPNXz09bL2q4rlVR+Wv2PggE17rsr7EFaGi/oszIIZv0TRQGbbEdp/sB daoY4F1uKBbTAmN+XAeQi5ruVDR2fSHPfVlJxrmYl4UdIgVWPnW9rTJD21Txy3u+5jlk XeL3knowAFTaApdRQ8FI38sLmH2Rdat5Y7jqajeVuomsFnsGp/YMLir7hkEu4IpSqoTC x5vQ==
- Dkim-signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1733305133; s=strato-dkim-0003; d=seimet.de; h=Message-ID:Subject:To:From:Date:Cc:Date:From:Subject:Sender; bh=L6XERutd2lPHlqsYQOG/GMhaEx7u2iOXcSNb0dxHK0k=; b=iXVCTExn/5RHVZUTkm+02UWsxaV7MtrAczV4b2WRZ5oBIZeJ2UhJ62sT4aLbK7z7fl rBwZCI39VnaaWm07ltBg==
Hi,
The attached patch for the SCSI driver in particular improves the error
handling. It now takes some features of the SG driver into account that are
a bit tricky to map to the SCSI Driver interface.
I have tested this code with a USB floppy drive, and also tested similar
code used by a SCSI-to-USB bridge software for the Raspberry Pi.
@Thorsten Maybe you can update the Aranym sources?
@Eero I hope that this time the format of my patch submission is
acceptable ;-).
The Hatari git is often very slow. "git pull" often takes several minutes
or just hangs.
Best regards
Uwe
>From fc41bfd4172ee5de0ae31a892b3516369e6d37c8 Mon Sep 17 00:00:00 2001
From: Uwe Seimet <Uwe.Seimet@xxxxxxxxx>
Date: Wed, 4 Dec 2024 10:33:45 +0100
Subject: [PATCH] Improve the mapping of the SCSI Driver interface to the Linux
SG driver
---
src/nf_scsidrv.c | 131 +++++++++++++++++++++++++++++++++++++----------
1 file changed, 103 insertions(+), 28 deletions(-)
diff --git a/src/nf_scsidrv.c b/src/nf_scsidrv.c
index 45abfe23..5fc0687a 100644
--- a/src/nf_scsidrv.c
+++ b/src/nf_scsidrv.c
@@ -1,7 +1,7 @@
/*
* Hatari - nf_scsidrv.c
*
- * Copyright (C) 2015-2016, 2018 by Uwe Seimet
+ * Copyright (C) 2015-2016, 2018, 2024 by Uwe Seimet
*
* This file is distributed under the GNU General Public License, version 2
* or at your option any later version. Read the file gpl.txt for details.
@@ -25,6 +25,7 @@ const char NfScsiDrv_fileid[] = "Hatari nf_scsidrv.c";
#endif
#include <sys/ioctl.h>
#include <scsi/sg.h>
+#include <scsi/scsi.h>
#include "stMemory.h"
#include "log.h"
#include "gemdos_defines.h"
@@ -43,6 +44,9 @@ const char NfScsiDrv_fileid[] = "Hatari nf_scsidrv.c";
// The maximum number of SCSI Driver handles, must be the same as in the stub
#define SCSI_MAX_HANDLES 32
+// The number of sense data bytes
+#define SENSE_LENGTH 18
+
typedef struct
{
@@ -53,6 +57,13 @@ typedef struct
static HANDLE_META_DATA handle_meta_data[SCSI_MAX_HANDLES];
+// The current sense data
+static uint8_t sense_data[SENSE_LENGTH];
+
+// The deferred sense data for 16 devices
+static uint8_t deferred_sense_data[16][SENSE_LENGTH];
+static bool deferred_sense_data_valid[16];
+
#if HAVE_UDEV
static struct udev *udev;
static struct udev_monitor *mon;
@@ -339,27 +350,60 @@ static int scsidrv_inout(uint32_t stack)
if (sense_buffer)
{
- memset(sense_buffer, 0, 18);
+ memset(sense_buffer, 0, SENSE_LENGTH);
}
- // No explicit LUN support, the SG driver maps LUNs to device files
- if (cmd[1] & 0xe0)
- {
- if (sense_buffer)
+ // There is no explicit LUN support, the SG driver maps each LUN to a device file
+ if ((cmd[1] & 0b11100000) && cmd[0] != INQUIRY)
+ {
+ // REQUEST SENSE has a special handling for non-existing LUNs
+ if (cmd[0] == REQUEST_SENSE)
+ {
+ memset(buffer, 0, SENSE_LENGTH);
+
+ // LOGICAL UNIT NOT SUPPORTED
+ buffer[0] = 0x70;
+ buffer[2] = ILLEGAL_REQUEST;
+ buffer[7] = 10;
+ buffer[12] = 0x25;
+ M68000_Flush_Data_Cache(st_buffer, SENSE_LENGTH);
+
+ // When signalling an invalid LUN, for REQUEST SENSE the status must be GOOD
+ return 0;
+ }
+ else if (sense_buffer)
{
- // Sense Key and ASC
- sense_buffer[2] = 0x05;
+ // LOGICAL UNIT NOT SUPPORTED
+ sense_buffer[0] = 0x70;
+ sense_buffer[2] = ILLEGAL_REQUEST;
+ sense_buffer[7] = 10;
sense_buffer[12] = 0x25;
- M68000_Flush_Data_Cache(st_sense_buffer, 18);
+ M68000_Flush_Data_Cache(st_sense_buffer, SENSE_LENGTH);
- LOG_TRACE(TRACE_SCSIDRV,
- "\n Sense Key=$%02X, ASC=$%02X, ASCQ=$00",
- sense_buffer[2], sense_buffer[12]);
+ LOG_TRACE(TRACE_SCSIDRV, "\n Sense Key=$05, ASC=$25, ASCQ=$00");
}
return 2;
}
+ const int id = handle_meta_data[handle].id_lo;
+
+ // Return deferred sense data, if any
+ if (cmd[0] == REQUEST_SENSE && deferred_sense_data_valid[id])
+ {
+ memcpy(buffer, deferred_sense_data[id], SENSE_LENGTH);
+ deferred_sense_data_valid[id] = false;
+ M68000_Flush_Data_Cache(st_buffer, SENSE_LENGTH);
+
+ LOG_TRACE(TRACE_SCSIDRV,
+ "\n Deferred Sense Key=$%02X, ASC=$%02X, ASCQ=$%02X",
+ buffer[2], buffer[12], buffer[13]);
+
+ return 0;
+ }
+
+ deferred_sense_data_valid[id] = false;
+
if (check_mchg_udev())
{
// cErrMediach for all open handles
@@ -374,8 +418,10 @@ static int scsidrv_inout(uint32_t stack)
if (sense_buffer)
{
- // Sense Key and ASC
- sense_buffer[2] = 0x06;
+ // NOT READY TO READY CHANGE
+ sense_buffer[0] = 0x70;
+ sense_buffer[2] = UNIT_ATTENTION;
+ sense_buffer[7] = 10;
sense_buffer[12] = 0x28;
}
@@ -397,8 +443,9 @@ static int scsidrv_inout(uint32_t stack)
io_hdr.dxferp = buffer;
io_hdr.dxfer_len = transfer_len;
- io_hdr.sbp = sense_buffer;
- io_hdr.mx_sb_len = 18;
+ memset(sense_data, 0, SENSE_LENGTH);
+ io_hdr.sbp = sense_data;
+ io_hdr.mx_sb_len = SENSE_LENGTH;
io_hdr.cmdp = cmd;
io_hdr.cmd_len = cmd_len;
@@ -407,44 +454,72 @@ static int scsidrv_inout(uint32_t stack)
status = ioctl(handle_meta_data[handle].fd,
SG_IO, &io_hdr) < 0 ? -1 : io_hdr.status;
- if(status == -1)
+ if (status == -1)
+ {
+ Log_Printf(LOG_ERROR, "\nscsidrv_inout: Can't transfer %d byte(s)\n", transfer_len);
+ }
+ // Do not treat CONDITION MET as en error
+ else if (status == 4)
{
- Log_Printf(LOG_ERROR, "\nCan't transfer %d byte(s)\n", transfer_len);
+ status = 0;
}
- if (!status && sense_buffer && sense_buffer[2] & 0x0f)
+ // If the command was successful, use the sense key as status
+ if (!status)
{
- status = sense_buffer[2] & 0x0f;
+ status = sense_data[2] & 0x0f;
+
+ if (cmd[0] == INQUIRY && (cmd[1] & 0b11100000))
+ {
+ // SCSI-2 section 8.2.5.1: Incorrect logical unit handling
+ buffer[0] = 0x7f;
+ }
}
}
- if (status > 0 && sense_buffer)
+ // If a sense buffer was passed, return the current sense data
+ if (sense_buffer)
{
- LOG_TRACE(TRACE_SCSIDRV,
- "\n Sense Key=$%02X, ASC=$%02X, ASCQ=$%02X",
- sense_buffer[2], sense_buffer[12], sense_buffer[13]);
+ memcpy(sense_buffer, sense_data, SENSE_LENGTH);
+
+ if (status) {
+ LOG_TRACE(TRACE_SCSIDRV,
+ "\n Sense Key=$%02X, ASC=$%02X, ASCQ=$%02X",
+ sense_data[2], sense_data[12], sense_data[13]);
+ }
if (status == 2)
{
// Automatic media change and reset handling for
// SCSI Driver version 1.0.1
- if ((sense_buffer[2] & 0x0f) && !sense_buffer[13])
+ if ((sense_data[2] & 0x0f) && !sense_data[13])
{
- if (sense_buffer[12] == 0x28)
+ if (sense_data[12] == 0x28)
{
// cErrMediach
set_error(handle, 1);
}
- else if (sense_buffer[12] == 0x29)
+ else if (sense_data[12] == 0x29)
{
// cErrReset
set_error(handle, 2);
}
}
}
+
+ }
+ // Remember sense data for a subsequent REQUEST SENSE
+ else
+ {
+ LOG_TRACE(TRACE_SCSIDRV,
+ "\n Defer Sense Key=$%02X, ASC=$%02X, ASCQ=$%02X",
+ sense_data[2], sense_data[12], sense_data[13]);
+
+ memcpy(deferred_sense_data[id], sense_data, SENSE_LENGTH);
+ deferred_sense_data_valid[id] = true;
}
- M68000_Flush_Data_Cache(st_sense_buffer, 18);
+ M68000_Flush_Data_Cache(st_sense_buffer, SENSE_LENGTH);
if (!dir)
{
M68000_Flush_All_Caches(st_buffer, transfer_len);
--
2.45.2