PERFORCE change 94416 for review
Marcel Moolenaar
marcel at FreeBSD.org
Sat Apr 1 19:11:30 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=94416
Change 94416 by marcel at marcel_nfs on 2006/04/01 19:11:26
IFC @94415
Affected files ...
.. //depot/projects/uart/amd64/conf/GENERIC#15 integrate
.. //depot/projects/uart/boot/forth/beastie.4th#7 integrate
.. //depot/projects/uart/compat/linux/linux_socket.c#11 integrate
.. //depot/projects/uart/compat/svr4/svr4_stream.c#8 integrate
.. //depot/projects/uart/conf/files.powerpc#8 integrate
.. //depot/projects/uart/dev/mpt/mpt.c#12 integrate
.. //depot/projects/uart/dev/mpt/mpt.h#9 integrate
.. //depot/projects/uart/dev/mpt/mpt_cam.c#9 integrate
.. //depot/projects/uart/dev/mpt/mpt_debug.c#11 integrate
.. //depot/projects/uart/dev/mpt/mpt_pci.c#15 integrate
.. //depot/projects/uart/dev/scc/scc_bfe.h#16 integrate
.. //depot/projects/uart/dev/scc/scc_bfe_ebus.c#7 integrate
.. //depot/projects/uart/dev/scc/scc_bfe_macio.c#1 branch
.. //depot/projects/uart/dev/scc/scc_bfe_sbus.c#7 integrate
.. //depot/projects/uart/dev/scc/scc_core.c#20 integrate
.. //depot/projects/uart/dev/scc/scc_dev_sab82532.c#9 integrate
.. //depot/projects/uart/dev/scc/scc_dev_z8530.c#11 integrate
.. //depot/projects/uart/dev/uart/uart_cpu.h#19 integrate
.. //depot/projects/uart/dev/uart/uart_dev_ns8250.c#39 integrate
.. //depot/projects/uart/dev/uart/uart_dev_sab82532.c#41 integrate
.. //depot/projects/uart/dev/uart/uart_dev_z8530.c#29 integrate
.. //depot/projects/uart/fs/devfs/devfs_vnops.c#14 integrate
.. //depot/projects/uart/i386/conf/GENERIC#14 integrate
.. //depot/projects/uart/kern/kern_descrip.c#22 integrate
.. //depot/projects/uart/kern/uipc_socket.c#17 integrate
.. //depot/projects/uart/kern/uipc_socket2.c#11 integrate
.. //depot/projects/uart/kern/uipc_syscalls.c#17 integrate
.. //depot/projects/uart/kern/uipc_usrreq.c#11 integrate
.. //depot/projects/uart/kern/vfs_mount.c#22 integrate
.. //depot/projects/uart/kern/vfs_subr.c#26 integrate
.. //depot/projects/uart/modules/scc/Makefile#4 integrate
.. //depot/projects/uart/net/raw_cb.c#5 integrate
.. //depot/projects/uart/net/raw_usrreq.c#6 integrate
.. //depot/projects/uart/net/rtsock.c#11 integrate
.. //depot/projects/uart/netatalk/ddp_usrreq.c#7 integrate
.. //depot/projects/uart/netatm/atm_aal5.c#6 integrate
.. //depot/projects/uart/netatm/atm_proto.c#6 integrate
.. //depot/projects/uart/netatm/atm_socket.c#9 integrate
.. //depot/projects/uart/netatm/atm_usrreq.c#7 integrate
.. //depot/projects/uart/netatm/atm_var.h#7 integrate
.. //depot/projects/uart/netgraph/bluetooth/include/ng_btsocket_hci_raw.h#4 integrate
.. //depot/projects/uart/netgraph/bluetooth/include/ng_btsocket_l2cap.h#5 integrate
.. //depot/projects/uart/netgraph/bluetooth/include/ng_btsocket_rfcomm.h#6 integrate
.. //depot/projects/uart/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c#6 integrate
.. //depot/projects/uart/netgraph/bluetooth/socket/ng_btsocket_l2cap.c#7 integrate
.. //depot/projects/uart/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c#6 integrate
.. //depot/projects/uart/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c#8 integrate
.. //depot/projects/uart/netgraph/ng_socket.c#9 integrate
.. //depot/projects/uart/netinet/in_pcb.c#12 integrate
.. //depot/projects/uart/netinet/in_pcb.h#8 integrate
.. //depot/projects/uart/netinet/ip_divert.c#10 integrate
.. //depot/projects/uart/netinet/raw_ip.c#14 integrate
.. //depot/projects/uart/netinet/tcp_input.c#19 integrate
.. //depot/projects/uart/netinet/tcp_subr.c#15 integrate
.. //depot/projects/uart/netinet/tcp_timer.c#11 integrate
.. //depot/projects/uart/netinet/tcp_usrreq.c#10 integrate
.. //depot/projects/uart/netinet/tcp_var.h#11 integrate
.. //depot/projects/uart/netinet/udp_usrreq.c#14 integrate
.. //depot/projects/uart/netinet6/in6_pcb.c#10 integrate
.. //depot/projects/uart/netinet6/in6_pcb.h#4 integrate
.. //depot/projects/uart/netinet6/raw_ip6.c#10 integrate
.. //depot/projects/uart/netinet6/udp6_usrreq.c#9 integrate
.. //depot/projects/uart/netipsec/keysock.c#8 integrate
.. //depot/projects/uart/netipx/ipx_usrreq.c#7 integrate
.. //depot/projects/uart/netipx/spx_usrreq.c#12 integrate
.. //depot/projects/uart/netkey/keysock.c#9 integrate
.. //depot/projects/uart/netnatm/natm.c#9 integrate
.. //depot/projects/uart/nfsclient/nfs_vfsops.c#12 integrate
.. //depot/projects/uart/sys/protosw.h#8 integrate
.. //depot/projects/uart/sys/socketvar.h#11 integrate
Differences ...
==== //depot/projects/uart/amd64/conf/GENERIC#15 (text+ko) ====
@@ -16,7 +16,7 @@
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
-# $FreeBSD: src/sys/amd64/conf/GENERIC,v 1.450 2006/03/29 09:57:21 scottl Exp $
+# $FreeBSD: src/sys/amd64/conf/GENERIC,v 1.451 2006/03/31 23:04:48 emax Exp $
cpu HAMMER
ident GENERIC
@@ -148,6 +148,8 @@
device atkbd # AT keyboard
device psm # PS/2 mouse
+device kbdmux # keyboard multiplexer
+
device vga # VGA video card driver
device splash # Splash screen and screen saver support
==== //depot/projects/uart/boot/forth/beastie.4th#7 (text+ko) ====
@@ -23,7 +23,7 @@
\ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
\ SUCH DAMAGE.
\
-\ $FreeBSD: src/sys/boot/forth/beastie.4th,v 1.11 2005/10/30 05:36:23 scottl Exp $
+\ $FreeBSD: src/sys/boot/forth/beastie.4th,v 1.12 2006/03/31 21:36:17 scottl Exp $
marker task-beastie.4th
@@ -40,7 +40,6 @@
variable bootkey
variable bootacpikey
-variable bootusbkey
variable bootsafekey
variable bootverbosekey
variable bootsinglekey
@@ -196,12 +195,6 @@
printmenuitem ." Boot FreeBSD in single user mode" bootsinglekey !
printmenuitem ." Boot FreeBSD with verbose logging" bootverbosekey !
printmenuitem ." Escape to loader prompt" escapekey !
- s" arch-i386" environment? if
- drop
- printmenuitem ." Boot FreeBSD with USB keyboard" bootusbkey !
- else
- -2 bootusbkey !
- then
printmenuitem ." Reboot" rebootkey !
menuX @ 20 at-xy
." Select option, [Enter] for default"
@@ -267,10 +260,6 @@
then
0 boot
then
- dup bootusbkey @ = if
- s" 0x1" s" hint.atkbd.0.flags" setenv
- 0 boot
- then
dup bootsafekey @ = if
s" arch-i386" environment? if
drop
@@ -283,6 +272,7 @@
s" 0" s" hw.ata.atapi_dma" setenv
s" 0" s" hw.ata.wc" setenv
s" 0" s" hw.eisa_slots" setenv
+ s" 1" s" hint.kbdmux.0.disabled" setenv
0 boot
then
dup bootverbosekey @ = if
==== //depot/projects/uart/compat/linux/linux_socket.c#11 (text+ko) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/linux/linux_socket.c,v 1.66 2006/03/21 21:56:04 netchild Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/linux/linux_socket.c,v 1.67 2006/04/01 15:25:01 rwatson Exp $");
/* XXX we use functions that might not exist. */
#include "opt_compat.h"
@@ -662,6 +662,10 @@
* Linux doesn't return EISCONN the first time it occurs,
* when on a non-blocking socket. Instead it returns the
* error getsockopt(SOL_SOCKET, SO_ERROR) would return on BSD.
+ *
+ * XXXRW: Instead of using fgetsock(), check that it is a
+ * socket and use the file descriptor reference instead of
+ * creating a new one.
*/
NET_LOCK_GIANT();
error = fgetsock(td, linux_args.s, &so, &fflag);
==== //depot/projects/uart/compat/svr4/svr4_stream.c#8 (text+ko) ====
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/svr4/svr4_stream.c,v 1.56 2005/09/28 07:03:02 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/svr4/svr4_stream.c,v 1.57 2006/04/01 15:25:01 rwatson Exp $");
#include "opt_compat.h"
#include "opt_ktrace.h"
@@ -167,6 +167,10 @@
struct uio *ktruio = NULL;
#endif
+ /*
+ * XXXRW: Instead of using fgetsock(), just rely on the file
+ * descriptor reference.
+ */
if ((error = fgetsock(td, s, &so, NULL)) != 0)
return (error);
@@ -263,6 +267,10 @@
struct uio *ktruio = NULL;
#endif
+ /*
+ * XXXRW: Instead of using fgetsock(), just rely on the file
+ * descriptor reference.
+ */
if ((error = fgetsock(td, s, &so, NULL)) != 0)
return (error);
==== //depot/projects/uart/conf/files.powerpc#8 (text+ko) ====
@@ -1,7 +1,7 @@
# This file tells config what files go into building a kernel,
# files marked standard are always included.
#
-# $FreeBSD: src/sys/conf/files.powerpc,v 1.50 2006/03/31 01:42:55 marcel Exp $
+# $FreeBSD: src/sys/conf/files.powerpc,v 1.51 2006/04/01 04:53:08 marcel Exp $
#
# The long compile-with and dependency lines are required because of
# limitations in config: backslash-newline doesn't work in strings, and
@@ -116,5 +116,6 @@
powerpc/psim/openpic_iobus.c optional psim
powerpc/psim/sio_iobus.c optional sio psim
+dev/scc/scc_bfe_macio.c optional scc powermac
dev/zs/zs.c optional powermac zs
dev/zs/zs_macio.c optional powermac zs
==== //depot/projects/uart/dev/mpt/mpt.c#12 (text+ko) ====
@@ -92,7 +92,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt.c,v 1.23 2006/03/26 07:16:17 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt.c,v 1.24 2006/04/01 07:12:18 mjacob Exp $");
#include <dev/mpt/mpt.h>
#include <dev/mpt/mpt_cam.h> /* XXX For static handler registration */
@@ -477,12 +477,12 @@
req->state &= ~REQ_STATE_QUEUED;
req->state |= REQ_STATE_DONE;
TAILQ_REMOVE(&mpt->request_pending_list, req, links);
-
- if ((req->state & REQ_STATE_NEED_WAKEUP) != 0)
+ if ((req->state & REQ_STATE_NEED_WAKEUP) != 0) {
wakeup(req);
+ }
}
- return (/*free_reply*/TRUE);
+ return (TRUE);
}
static int
@@ -490,7 +490,7 @@
uint32_t reply_desc, MSG_DEFAULT_REPLY *reply_frame)
{
/* Nothing to be done. */
- return (/*free_reply*/TRUE);
+ return (TRUE);
}
static int
@@ -499,11 +499,8 @@
{
int free_reply;
- if (reply_frame == NULL) {
- mpt_prt(mpt, "Event Handler: req %p:%u - Unexpected NULL reply\n",
- req, req->serno);
- return (/*free_reply*/TRUE);
- }
+ KASSERT(reply_frame != NULL, ("null reply in mpt_event_reply_handler"));
+ KASSERT(req != NULL, ("null request in mpt_event_reply_handler"));
free_reply = TRUE;
switch (reply_frame->Function) {
@@ -535,7 +532,7 @@
uint32_t context;
context = htole32(req->index|MPT_REPLY_HANDLER_EVENTS);
- ack_req = mpt_get_request(mpt, /*sleep_ok*/FALSE);
+ ack_req = mpt_get_request(mpt, FALSE);
if (ack_req == NULL) {
struct mpt_evtf_record *evtf;
@@ -546,32 +543,59 @@
break;
}
mpt_send_event_ack(mpt, ack_req, msg, context);
+ /*
+ * Don't check for CONTINUATION_REPLY here
+ */
+ return (free_reply);
}
break;
}
case MPI_FUNCTION_PORT_ENABLE:
- mpt_lprt(mpt, MPT_PRT_DEBUG, "enable port reply\n");
+ mpt_lprt(mpt, MPT_PRT_DEBUG , "enable port reply\n");
break;
case MPI_FUNCTION_EVENT_ACK:
break;
default:
- mpt_prt(mpt, "Unknown Event Function: %x\n",
+ mpt_prt(mpt, "unknown event function: %x\n",
reply_frame->Function);
break;
}
- if (req != NULL
- && (reply_frame->MsgFlags & MPI_MSGFLAGS_CONTINUATION_REPLY) == 0) {
-
- req->state &= ~REQ_STATE_QUEUED;
- req->state |= REQ_STATE_DONE;
+ /*
+ * I'm not sure that this continuation stuff works as it should.
+ *
+ * I've had FC async events occur that free the frame up because
+ * the continuation bit isn't set, and then additional async events
+ * then occur using the same context. As you might imagine, this
+ * leads to Very Bad Thing.
+ *
+ * Let's just be safe for now and not free them up until we figure
+ * out what's actually happening here.
+ */
+#if 0
+ if ((reply_frame->MsgFlags & MPI_MSGFLAGS_CONTINUATION_REPLY) == 0) {
TAILQ_REMOVE(&mpt->request_pending_list, req, links);
-
- if ((req->state & REQ_STATE_NEED_WAKEUP) != 0)
- wakeup(req);
- else
- mpt_free_request(mpt, req);
+ mpt_free_request(mpt, req);
+ mpt_prt(mpt, "event_reply %x for req %p:%u NOT a continuation",
+ reply_frame->Function, req, req->serno);
+ if (reply_frame->Function == MPI_FUNCTION_EVENT_NOTIFICATION) {
+ MSG_EVENT_NOTIFY_REPLY *msg =
+ (MSG_EVENT_NOTIFY_REPLY *)reply_frame;
+ mpt_prtc(mpt, " Event=0x%x AckReq=%d",
+ msg->Event, msg->AckRequired);
+ }
+ } else {
+ mpt_prt(mpt, "event_reply %x for %p:%u IS a continuation",
+ reply_frame->Function, req, req->serno);
+ if (reply_frame->Function == MPI_FUNCTION_EVENT_NOTIFICATION) {
+ MSG_EVENT_NOTIFY_REPLY *msg =
+ (MSG_EVENT_NOTIFY_REPLY *)reply_frame;
+ mpt_prtc(mpt, " Event=0x%x AckReq=%d",
+ msg->Event, msg->AckRequired);
+ }
+ mpt_prtc(mpt, "\n");
}
+#endif
return (free_reply);
}
@@ -609,10 +633,10 @@
case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE:
break;
default:
- return (/*handled*/0);
+ return (0);
break;
}
- return (/*handled*/1);
+ return (1);
}
static void
@@ -622,7 +646,7 @@
MSG_EVENT_ACK *ackp;
ackp = (MSG_EVENT_ACK *)ack_req->req_vbuf;
- bzero(ackp, sizeof *ackp);
+ memset(ackp, 0, sizeof (*ackp));
ackp->Function = MPI_FUNCTION_EVENT_ACK;
ackp->Event = msg->Event;
ackp->EventContext = msg->EventContext;
@@ -637,6 +661,7 @@
{
struct mpt_softc *mpt;
uint32_t reply_desc;
+ uint32_t last_reply_desc = MPT_REPLY_EMPTY;
int ntrips = 0;
mpt = (struct mpt_softc *)arg;
@@ -649,6 +674,15 @@
u_int req_index;
int free_rf;
+ if (reply_desc == last_reply_desc) {
+ mpt_prt(mpt, "debounce reply_desc 0x%x\n", reply_desc);
+ if (ntrips++ == 1000) {
+ break;
+ }
+ continue;
+ }
+ last_reply_desc = reply_desc;
+
req = NULL;
reply_frame = NULL;
reply_baddr = 0;
@@ -657,7 +691,7 @@
/*
* Insure that the reply frame is coherent.
*/
- reply_baddr = (reply_desc << 1);
+ reply_baddr = MPT_REPLY_BADDR(reply_desc);
offset = reply_baddr - (mpt->reply_phys & 0xFFFFFFFF);
bus_dmamap_sync_range(mpt->reply_dmat,
mpt->reply_dmap, offset, MPT_REPLY_SIZE,
@@ -732,13 +766,17 @@
req_index = MPT_CONTEXT_TO_REQI(ctxt_idx);
if (req_index < MPT_MAX_REQUESTS(mpt)) {
req = &mpt->request_pool[req_index];
+ } else {
+ mpt_prt(mpt, "WARN: mpt_intr index == %d (reply_desc =="
+ " 0x%x)\n", req_index, reply_desc);
}
free_rf = mpt_reply_handlers[cb_index](mpt, req,
reply_desc, reply_frame);
- if (reply_frame != NULL && free_rf)
+ if (reply_frame != NULL && free_rf) {
mpt_free_reply(mpt, reply_baddr);
+ }
/*
* If we got ourselves disabled, don't get stuck in a loop
@@ -761,12 +799,13 @@
MSG_DEFAULT_REPLY ioc_status_frame;
request_t *req;
- bzero(&ioc_status_frame, sizeof(ioc_status_frame));
+ memset(&ioc_status_frame, 0, sizeof(ioc_status_frame));
ioc_status_frame.MsgLength = roundup2(sizeof(ioc_status_frame), 4);
ioc_status_frame.IOCStatus = iocstatus;
while((req = TAILQ_FIRST(chain)) != NULL) {
MSG_REQUEST_HEADER *msg_hdr;
u_int cb_index;
+
TAILQ_REMOVE(chain, req, links);
msg_hdr = (MSG_REQUEST_HEADER *)req->req_vbuf;
ioc_status_frame.Function = msg_hdr->Function;
@@ -784,7 +823,6 @@
void
mpt_dump_reply_frame(struct mpt_softc *mpt, MSG_DEFAULT_REPLY *reply_frame)
{
-
mpt_prt(mpt, "Address Reply:\n");
mpt_print_reply(reply_frame);
}
@@ -1072,7 +1110,7 @@
pers->reset(mpt, ret);
}
- if (reinit != 0) {
+ if (reinit) {
ret = mpt_enable_ioc(mpt, 1);
if (ret == MPT_OK) {
mpt_enable_ints(mpt);
@@ -1100,13 +1138,18 @@
req->chain = NULL;
mpt_free_request(mpt, nxt); /* NB: recursion */
}
- req->serno = 0;
+
+ KASSERT(req->state != REQ_STATE_FREE, ("freeing free request"));
+ KASSERT(!(req->state & REQ_STATE_LOCKED), ("freeing locked request"));
+
req->ccb = NULL;
- req->state = REQ_STATE_FREE;
+
if (LIST_EMPTY(&mpt->ack_frames)) {
/*
* Insert free ones at the tail
*/
+ req->serno = 0;
+ req->state = REQ_STATE_FREE;
TAILQ_INSERT_TAIL(&mpt->request_free_list, req, links);
if (mpt->getreqwaiter != 0) {
mpt->getreqwaiter = 0;
@@ -1120,6 +1163,10 @@
*/
record = LIST_FIRST(&mpt->ack_frames);
LIST_REMOVE(record, links);
+ req->state = REQ_STATE_ALLOCATED;
+ if ((req->serno = mpt->sequence++) == 0) {
+ req->serno = mpt->sequence++;
+ }
mpt_send_event_ack(mpt, req, &record->reply, record->context);
reply_baddr = (uint32_t)((uint8_t *)record - mpt->reply)
+ (mpt->reply_phys & 0xFFFFFFFF);
@@ -1137,16 +1184,20 @@
if (req != NULL) {
KASSERT(req == &mpt->request_pool[req->index],
("mpt_get_request: corrupted request free list\n"));
+ KASSERT(req->state == REQ_STATE_FREE,
+ ("req not free on free list %x", req->state));
TAILQ_REMOVE(&mpt->request_free_list, req, links);
req->state = REQ_STATE_ALLOCATED;
req->chain = NULL;
- req->serno = mpt->sequence++;
+ if ((req->serno = mpt->sequence++) == 0) {
+ req->serno = mpt->sequence++;
+ }
} else if (sleep_ok != 0) {
mpt->getreqwaiter = 1;
mpt_sleep(mpt, &mpt->request_free_list, PUSER, "mptgreq", 0);
goto retry;
}
- return req;
+ return (req);
}
/* Pass the command to the IOC */
@@ -1339,11 +1390,21 @@
*data16++ = mpt_read(mpt, MPT_OFFSET_DOORBELL) & MPT_DB_DATA_MASK;
mpt_write(mpt, MPT_OFFSET_INTR_STATUS, 0);
- /* With the second word, we can now look at the length */
- if (((reply_len >> 1) != hdr->MsgLength)) {
+ /*
+ * With the second word, we can now look at the length.
+ * Warn about a reply that's too short (except for IOC FACTS REPLY)
+ */
+ if ((reply_len >> 1) != hdr->MsgLength &&
+ (hdr->Function != MPI_FUNCTION_IOC_FACTS)){
+#if __FreeBSD_version >= 500000
+ mpt_prt(mpt, "reply length does not match message length: "
+ "got %x; expected %x for function %x\n",
+ hdr->MsgLength << 2, reply_len << 1, hdr->Function);
+#else
mpt_prt(mpt, "reply length does not match message length: "
- "got 0x%02x, expected 0x%02zx\n",
- hdr->MsgLength << 2, reply_len << 1);
+ "got %x; expected %zx for function %x\n",
+ hdr->MsgLength << 2, reply_len << 1, hdr->Function);
+#endif
}
/* Get rest of the reply; but don't overflow the provided buffer */
@@ -1386,7 +1447,7 @@
MSG_IOC_FACTS f_req;
int error;
- bzero(&f_req, sizeof f_req);
+ memset(&f_req, 0, sizeof f_req);
f_req.Function = MPI_FUNCTION_IOC_FACTS;
f_req.MsgContext = htole32(MPT_REPLY_HANDLER_HANDSHAKE);
error = mpt_send_handshake_cmd(mpt, sizeof f_req, &f_req);
@@ -1426,7 +1487,7 @@
MSG_IOC_INIT init;
MSG_IOC_INIT_REPLY reply;
- bzero(&init, sizeof init);
+ memset(&init, 0, sizeof init);
init.WhoInit = who;
init.Function = MPI_FUNCTION_IOC_INIT;
if (mpt->is_fc) {
@@ -1644,10 +1705,17 @@
if (rv)
return (rv);
+#if __FreeBSD_version >= 500000
mpt_lprt(mpt, MPT_PRT_DEBUG, "IOC Page 2 Header: ver %x, len %zx, "
"num %x, type %x\n", hdr.PageVersion,
hdr.PageLength * sizeof(uint32_t),
hdr.PageNumber, hdr.PageType);
+#else
+ mpt_lprt(mpt, MPT_PRT_DEBUG, "IOC Page 2 Header: ver %x, len %z, "
+ "num %x, type %x\n", hdr.PageVersion,
+ hdr.PageLength * sizeof(uint32_t),
+ hdr.PageNumber, hdr.PageType);
+#endif
len = hdr.PageLength * sizeof(uint32_t);
mpt->ioc_page2 = malloc(len, M_DEVBUF, M_NOWAIT | M_ZERO);
@@ -1788,7 +1856,7 @@
return (-1);
enable_req = req->req_vbuf;
- bzero(enable_req, MPT_RQSL(mpt));
+ memset(enable_req, 0, MPT_RQSL(mpt));
enable_req->Function = MPI_FUNCTION_PORT_ENABLE;
enable_req->MsgContext = htole32(req->index | MPT_REPLY_HANDLER_CONFIG);
@@ -1812,9 +1880,6 @@
/*
* Enable/Disable asynchronous event reporting.
- *
- * NB: this is the first command we send via shared memory
- * instead of the handshake register.
*/
static int
mpt_send_event_request(struct mpt_softc *mpt, int onoff)
@@ -1822,20 +1887,24 @@
request_t *req;
MSG_EVENT_NOTIFY *enable_req;
- req = mpt_get_request(mpt, /*sleep_ok*/FALSE);
-
+ req = mpt_get_request(mpt, FALSE);
+ if (req == NULL) {
+ return (ENOMEM);
+ }
enable_req = req->req_vbuf;
- bzero(enable_req, sizeof *enable_req);
+ memset(enable_req, 0, sizeof *enable_req);
enable_req->Function = MPI_FUNCTION_EVENT_NOTIFICATION;
enable_req->MsgContext = htole32(req->index | MPT_REPLY_HANDLER_EVENTS);
enable_req->Switch = onoff;
mpt_check_doorbell(mpt);
- mpt_lprt(mpt, MPT_PRT_DEBUG,
- "%sabling async events\n", onoff ? "en" : "dis");
+ mpt_lprt(mpt, MPT_PRT_DEBUG, "%sabling async events\n",
+ onoff ? "en" : "dis");
+ /*
+ * Send the command off, but don't wait for it.
+ */
mpt_send_cmd(mpt, req);
-
return (0);
}
@@ -1980,8 +2049,11 @@
/* Put all request buffers on the free list */
TAILQ_INIT(&mpt->request_pending_list);
TAILQ_INIT(&mpt->request_free_list);
+ TAILQ_INIT(&mpt->request_timeout_list);
for (val = 0; val < MPT_MAX_REQUESTS(mpt); val++) {
- mpt_free_request(mpt, &mpt->request_pool[val]);
+ request_t *req = &mpt->request_pool[val];
+ req->state = REQ_STATE_ALLOCATED;
+ mpt_free_request(mpt, req);
}
for (val = 0; val < MPT_MAX_LUNS; val++) {
@@ -2462,7 +2534,8 @@
/*
- * Enable the port if asked
+ * Enable the port if asked. This is only done if we're resetting
+ * the IOC after initial startup.
*/
if (portenable) {
/*
==== //depot/projects/uart/dev/mpt/mpt.h#9 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/dev/mpt/mpt.h,v 1.13 2006/03/25 07:08:26 mjacob Exp $ */
+/* $FreeBSD: src/sys/dev/mpt/mpt.h,v 1.14 2006/04/01 07:12:18 mjacob Exp $ */
/*-
* Generic defines for LSI '909 FC adapters.
* FreeBSD Version.
@@ -278,12 +278,14 @@
/**************************** MPI Transaction State ***************************/
typedef enum {
- REQ_STATE_FREE = 0x00,
- REQ_STATE_ALLOCATED = 0x01,
- REQ_STATE_QUEUED = 0x02,
- REQ_STATE_DONE = 0x04,
- REQ_STATE_TIMEDOUT = 0x08,
- REQ_STATE_NEED_WAKEUP = 0x10,
+ REQ_STATE_NIL = 0x00,
+ REQ_STATE_FREE = 0x01,
+ REQ_STATE_ALLOCATED = 0x02,
+ REQ_STATE_QUEUED = 0x04,
+ REQ_STATE_DONE = 0x08,
+ REQ_STATE_TIMEDOUT = 0x10,
+ REQ_STATE_NEED_WAKEUP = 0x20,
+ REQ_STATE_LOCKED = 0x80, /* can't be freed */
REQ_STATE_MASK = 0xFF
} mpt_req_state_t;
@@ -292,7 +294,7 @@
mpt_req_state_t state; /* Request State Information */
uint16_t index; /* Index of this entry */
uint16_t IOCStatus; /* Completion status */
- uint16_t serno; /* serial number */
+ uint32_t serno; /* serial number */
union ccb *ccb; /* CAM request */
void *req_vbuf; /* Virtual Address of Entry */
void *sense_vbuf; /* Virtual Address of sense data */
@@ -310,11 +312,11 @@
uint32_t bytes_xfered; /* current relative offset */
union ccb *ccb; /* pointer to currently active ccb */
request_t *req; /* pointer to currently active assist request */
- int flags;
-#define BOGUS_JO 0x01
int nxfers;
+ uint32_t tag_id;
enum {
TGT_STATE_NIL,
+ TGT_STATE_LOADING,
TGT_STATE_LOADED,
TGT_STATE_IN_CAM,
TGT_STATE_SETTING_UP_FOR_DATA,
@@ -335,12 +337,12 @@
* which owns the incoming ATIO plus a rolling sequence number.
*/
#define MPT_MAKE_TAGID(mpt, req, ioindex) \
- ((ioindex << 16) | (mpt->sequence++))
+ ((ioindex << 18) | (((mpt->sequence++) & 0x3f) << 12) | (req->index & 0xfff))
#ifdef INVARIANTS
#define MPT_TAG_2_REQ(a, b) mpt_tag_2_req(a, (uint32_t) b)
#else
-#define MPT_TAG_2_REQ(mpt, tag) mpt->tgt_cmd_ptrs[tag >> 16]
+#define MPT_TAG_2_REQ(mpt, tag) mpt->tgt_cmd_ptrs[tag >> 18]
#endif
#define MPT_TGT_STATE(mpt, req) ((mpt_tgt_state_t *) \
@@ -509,6 +511,7 @@
uint8_t mpt_max_devices;
uint8_t mpt_max_buses;
uint8_t ioc_facts_flags;
+ uint8_t padding0;
/*
* Port Facts
@@ -615,11 +618,6 @@
struct req_queue request_pending_list;
struct req_queue request_timeout_list;
- /*
- * Deferred frame acks due to resource shortage.
- */
- struct mpt_evtf_list ack_frames;
-
struct cam_sim *sim;
struct cam_path *path;
@@ -631,6 +629,10 @@
request_t *tmf_req;
/*
+ * Deferred frame acks due to resource shortage.
+ */
+ struct mpt_evtf_list ack_frames;
+ /*
* Target Mode Support
*/
uint32_t scsi_tgt_handler_id;
@@ -644,13 +646,11 @@
tgt_resource_t trt_wildcard; /* wildcard luns */
tgt_resource_t trt[MPT_MAX_LUNS];
uint16_t tgt_cmds_allocated;
+ uint16_t padding1;
- /*
- * Stuff..
- */
- uint16_t sequence; /* Sequence Number */
uint16_t timeouts; /* timeout count */
uint16_t success; /* successes afer timeout */
+ uint32_t sequence; /* Sequence Number */
/* Opposing port in a 929 or 1030, or NULL */
@@ -806,18 +806,12 @@
#define MPT_SENSE_SIZE 32 /* included in MPT_REQUEST_AREA */
#define MPT_REQ_MEM_SIZE(mpt) (MPT_MAX_REQUESTS(mpt) * MPT_REQUEST_AREA)
-/*
- * Currently we try to pack both callbacks and request indices into 14 bits
- * so that we don't have to get fancy when we get a target mode context
- * reply (which only has 14 bits of IoIndex value) or a normal scsi
- * initiator context reply (where we get bits 28..0 of context).
- */
-#define MPT_CONTEXT_CB_SHIFT (14)
+#define MPT_CONTEXT_CB_SHIFT (16)
#define MPT_CBI(handle) (handle >> MPT_CONTEXT_CB_SHIFT)
#define MPT_CBI_TO_HID(cbi) ((cbi) << MPT_CONTEXT_CB_SHIFT)
#define MPT_CONTEXT_TO_CBI(x) \
(((x) >> MPT_CONTEXT_CB_SHIFT) & (MPT_NUM_REPLY_HANDLERS - 1))
-#define MPT_CONTEXT_REQI_MASK 0x3FFF
+#define MPT_CONTEXT_REQI_MASK 0xFFFF
#define MPT_CONTEXT_TO_REQI(x) ((x) & MPT_CONTEXT_REQI_MASK)
/*
@@ -857,8 +851,9 @@
return mpt_read(mpt, MPT_OFFSET_REPLY_Q);
}
-void mpt_complete_request_chain(struct mpt_softc *mpt,
- struct req_queue *chain, u_int iocstatus);
+void
+mpt_complete_request_chain(struct mpt_softc *, struct req_queue *, u_int);
+
/************************** Scatter Gather Managment **************************/
/* MPT_RQSL- size of request frame, in bytes */
#define MPT_RQSL(mpt) (mpt->request_frame_size << 2)
@@ -954,7 +949,7 @@
static __inline request_t *
mpt_tag_2_req(struct mpt_softc *mpt, uint32_t tag)
{
- uint16_t rtg = (tag >> 16);
+ uint16_t rtg = (tag >> 18);
KASSERT(rtg < mpt->tgt_cmds_allocated, ("bad tag %d\n", tag));
KASSERT(mpt->tgt_cmd_ptrs, ("no cmd backpointer array"));
KASSERT(mpt->tgt_cmd_ptrs[rtg], ("no cmd backpointer"));
==== //depot/projects/uart/dev/mpt/mpt_cam.c#9 (text+ko) ====
@@ -91,7 +91,7 @@
* OWNER OR CONTRIBUTOR IS ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_cam.c,v 1.12 2006/03/25 07:08:26 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_cam.c,v 1.13 2006/04/01 07:12:18 mjacob Exp $");
#include <dev/mpt/mpt.h>
#include <dev/mpt/mpt_cam.h>
@@ -114,19 +114,18 @@
static mpt_reply_handler_t mpt_scsi_reply_handler;
static mpt_reply_handler_t mpt_scsi_tmf_reply_handler;
static mpt_reply_handler_t mpt_fc_els_reply_handler;
-static mpt_reply_handler_t mpt_scsi_tgt_reply_handler;
-static int mpt_scsi_reply_frame_handler(struct mpt_softc *mpt, request_t *req,
- MSG_DEFAULT_REPLY *reply_frame);
-static int mpt_bus_reset(struct mpt_softc *, int /*sleep_ok*/);
+static int mpt_scsi_reply_frame_handler(struct mpt_softc *, request_t *,
+ MSG_DEFAULT_REPLY *);
+static int mpt_bus_reset(struct mpt_softc *, int);
static int mpt_fc_reset_link(struct mpt_softc *, int);
static int mpt_spawn_recovery_thread(struct mpt_softc *mpt);
static void mpt_terminate_recovery_thread(struct mpt_softc *mpt);
static void mpt_recovery_thread(void *arg);
-static int mpt_scsi_send_tmf(struct mpt_softc *, u_int /*type*/,
- u_int /*flags*/, u_int /*channel*/,
- u_int /*target*/, u_int /*lun*/,
- u_int /*abort_ctx*/, int /*sleep_ok*/);
+static void mpt_recover_commands(struct mpt_softc *mpt);
+
+static int mpt_scsi_send_tmf(struct mpt_softc *, u_int, u_int, u_int,
+ u_int, u_int, u_int, int);
static void mpt_fc_add_els(struct mpt_softc *mpt, request_t *);
static void mpt_post_target_command(struct mpt_softc *, request_t *, int);
@@ -135,9 +134,15 @@
static int mpt_disable_lun(struct mpt_softc *, target_id_t, lun_id_t);
static void mpt_target_start_io(struct mpt_softc *, union ccb *);
static cam_status mpt_abort_target_ccb(struct mpt_softc *, union ccb *);
-static cam_status mpt_abort_target_cmd(struct mpt_softc *, request_t *);
-
-static void mpt_recover_commands(struct mpt_softc *mpt);
+static int mpt_abort_target_cmd(struct mpt_softc *, request_t *);
+static void mpt_scsi_tgt_status(struct mpt_softc *, union ccb *, request_t *,
+ uint8_t, uint8_t const *);
+static void
+mpt_scsi_tgt_tsk_mgmt(struct mpt_softc *, request_t *, mpt_task_mgmt_t,
+ tgt_resource_t *, int);
+static void mpt_tgt_dump_tgt_state(struct mpt_softc *, request_t *);
+static void mpt_tgt_dump_req_state(struct mpt_softc *, request_t *);
+static mpt_reply_handler_t mpt_scsi_tgt_reply_handler;
static uint32_t scsi_io_handler_id = MPT_HANDLER_ID_NONE;
static uint32_t scsi_tmf_handler_id = MPT_HANDLER_ID_NONE;
@@ -257,7 +262,7 @@
/*
* We keep one request reserved for timeout TMF requests.
*/
- mpt->tmf_req = mpt_get_request(mpt, /*sleep_ok*/FALSE);
+ mpt->tmf_req = mpt_get_request(mpt, FALSE);
if (mpt->tmf_req == NULL) {
mpt_prt(mpt, "Unable to allocate dedicated TMF request!\n");
error = ENOMEM;
@@ -435,6 +440,10 @@
U32 fl;
int r, doit = 0;
+ if ((mpt->role & MPT_ROLE_TARGET) == 0) {
+ return (0);
+ }
+
r = mpt_read_cfg_header(mpt, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0,
&fc.Header, FALSE, 5000);
if (r) {
@@ -478,6 +487,10 @@
}
mpt_prt(mpt, cc);
}
+#else
+ if ((mpt->role & MPT_ROLE_TARGET) == 0) {
+ return (0);
+ }
#endif
return (mpt_fc_reset_link(mpt, 1));
}
@@ -822,17 +835,12 @@
request_t *req;
ccb = (union ccb *)arg;
-#ifdef NOTYET
- mpt = mpt_find_softc(mpt);
- if (mpt == NULL)
- return;
-#else
mpt = ccb->ccb_h.ccb_mpt_ptr;
-#endif
MPT_LOCK(mpt);
req = ccb->ccb_h.ccb_req_ptr;
- mpt_prt(mpt, "Request %p Timed out.\n", req);
+ mpt_prt(mpt, "request %p:%u timed out for ccb %p (req->ccb %p)\n", req,
+ req->serno, ccb, req->ccb);
if ((req->state & REQ_STATE_QUEUED) == REQ_STATE_QUEUED) {
TAILQ_REMOVE(&mpt->request_pending_list, req, links);
TAILQ_INSERT_TAIL(&mpt->request_timeout_list, req, links);
@@ -993,7 +1001,7 @@
for (seg = 0; seg < first_lim; seg++, se++, dm_segs++) {
uint32_t tf;
- bzero(se, sizeof (*se));
+ memset(se, 0, sizeof (*se));
se->Address.Low = dm_segs->ds_addr;
if (sizeof(bus_addr_t) > 4) {
se->Address.High = ((uint64_t) dm_segs->ds_addr) >> 32;
@@ -1061,7 +1069,7 @@
/*
* Now initialized the chain descriptor.
*/
- bzero(ce, sizeof (SGE_CHAIN64));
+ memset(ce, 0, sizeof (*ce));
/*
* Get the physical address of the chain list.
@@ -1108,7 +1116,7 @@
* set the end of list and end of buffer flags.
*/
while (seg < this_seg_lim) {
- bzero(se, sizeof (*se));
+ memset(se, 0, sizeof (*se));
se->Address.Low = dm_segs->ds_addr;
if (sizeof (bus_addr_t) > 4) {
se->Address.High =
@@ -1369,7 +1377,7 @@
for (seg = 0; seg < first_lim; seg++, se++, dm_segs++) {
uint32_t tf;
- bzero(se, sizeof (*se));
+ memset(se, 0,sizeof (*se));
se->Address = dm_segs->ds_addr;
MPI_pSGE_SET_LENGTH(se, dm_segs->ds_len);
tf = flags;
@@ -1434,7 +1442,7 @@
/*
* Now initialized the chain descriptor.
*/
- bzero(ce, sizeof (SGE_CHAIN32));
+ memset(ce, 0, sizeof (*ce));
/*
* Get the physical address of the chain list.
@@ -1476,7 +1484,7 @@
* set the end of list and end of buffer flags.
*/
while (seg < this_seg_lim) {
- bzero(se, sizeof (*se));
+ memset(se, 0, sizeof (*se));
se->Address = dm_segs->ds_addr;
MPI_pSGE_SET_LENGTH(se, dm_segs->ds_len);
tf = flags;
@@ -1604,8 +1612,7 @@
raid_passthru = (sim == mpt->phydisk_sim);
CAMLOCK_2_MPTLOCK(mpt);
- /* Get a request structure off the free list */
- if ((req = mpt_get_request(mpt, /*sleep_ok*/FALSE)) == NULL) {
+ if ((req = mpt_get_request(mpt, FALSE)) == NULL) {
if (mpt->outofbeer == 0) {
mpt->outofbeer = 1;
xpt_freeze_simq(mpt->sim, 1);
@@ -1642,15 +1649,13 @@
/* Now we build the command for the IOC */
mpt_req = req->req_vbuf;
- bzero(mpt_req, sizeof *mpt_req);
+ memset(mpt_req, 0, sizeof (MSG_SCSI_IO_REQUEST));
mpt_req->Function = MPI_FUNCTION_SCSI_IO_REQUEST;
if (raid_passthru) {
mpt_req->Function = MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH;
}
-
mpt_req->Bus = 0; /* we don't have multiport devices yet */
-
mpt_req->SenseBufferLength =
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list