From owner-svn-src-stable-11@freebsd.org Thu Jan 5 00:26:59 2017 Return-Path: Delivered-To: svn-src-stable-11@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 1793CC9FCEA; Thu, 5 Jan 2017 00:26:59 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id CC9C01792; Thu, 5 Jan 2017 00:26:58 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v050Qw6p076400; Thu, 5 Jan 2017 00:26:58 GMT (envelope-from gonzo@FreeBSD.org) Received: (from gonzo@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v050QwPS076399; Thu, 5 Jan 2017 00:26:58 GMT (envelope-from gonzo@FreeBSD.org) Message-Id: <201701050026.v050QwPS076399@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gonzo set sender to gonzo@FreeBSD.org using -f From: Oleksandr Tymoshenko Date: Thu, 5 Jan 2017 00:26:57 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r311342 - stable/11/sys/dev/spibus X-SVN-Group: stable-11 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-stable-11@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: SVN commit messages for only the 11-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Jan 2017 00:26:59 -0000 Author: gonzo Date: Thu Jan 5 00:26:57 2017 New Revision: 311342 URL: https://svnweb.freebsd.org/changeset/base/311342 Log: MFC r310170, r310492 r310170: [spigen] Make "data" part of spigen_transfer optional Make st_data part of spigen_transfer optional by letting pass zero length and NULL pointer. SPI controller drivers handle this case fine. r310492: [spigen] Fix spigen attaching as a driver for SPI devices nodes in FDT Return BUS_PROBE_NOWILDCARD in probe method to make sure that spigen attaches only to the device created in identify method. Before this change spigen probe method used to return 0 which meant it competed with other drivers to be attached to the devices created for child nodes of SPI bus node in FDT. Reported by: Daniel Braniss Modified: stable/11/sys/dev/spibus/spigen.c Directory Properties: stable/11/ (props changed) Modified: stable/11/sys/dev/spibus/spigen.c ============================================================================== --- stable/11/sys/dev/spibus/spigen.c Thu Jan 5 00:08:04 2017 (r311341) +++ stable/11/sys/dev/spibus/spigen.c Thu Jan 5 00:26:57 2017 (r311342) @@ -68,8 +68,10 @@ struct spigen_softc { static int spigen_probe(device_t dev) { + device_set_desc(dev, "SPI Generic IO"); - return (0); + + return (BUS_PROBE_NOWILDCARD); } static int spigen_open(struct cdev *, int, int, struct thread *); @@ -191,7 +193,7 @@ spigen_transfer(struct cdev *cdev, struc int error = 0; mtx_lock(&sc->sc_mtx); - if (st->st_command.iov_len == 0 || st->st_data.iov_len == 0) + if (st->st_command.iov_len == 0) error = EINVAL; else if (st->st_command.iov_len > sc->sc_command_length_max || st->st_data.iov_len > sc->sc_data_length_max) @@ -208,16 +210,20 @@ spigen_transfer(struct cdev *cdev, struc M_DEVBUF, M_WAITOK); if (transfer.tx_cmd == NULL) return (ENOMEM); - transfer.tx_data = transfer.rx_data = malloc(st->st_data.iov_len, - M_DEVBUF, M_WAITOK); - if (transfer.tx_data == NULL) { - free(transfer.tx_cmd, M_DEVBUF); - return (ENOMEM); + if (st->st_data.iov_len > 0) { + transfer.tx_data = transfer.rx_data = malloc(st->st_data.iov_len, + M_DEVBUF, M_WAITOK); + if (transfer.tx_data == NULL) { + free(transfer.tx_cmd, M_DEVBUF); + return (ENOMEM); + } } + else + transfer.tx_data = transfer.rx_data = NULL; error = copyin(st->st_command.iov_base, transfer.tx_cmd, transfer.tx_cmd_sz = transfer.rx_cmd_sz = st->st_command.iov_len); - if (error == 0) + if ((error == 0) && (st->st_data.iov_len > 0)) error = copyin(st->st_data.iov_base, transfer.tx_data, transfer.tx_data_sz = transfer.rx_data_sz = st->st_data.iov_len); @@ -226,7 +232,7 @@ spigen_transfer(struct cdev *cdev, struc if (error == 0) { error = copyout(transfer.rx_cmd, st->st_command.iov_base, transfer.rx_cmd_sz); - if (error == 0) + if ((error == 0) && (st->st_data.iov_len > 0)) error = copyout(transfer.rx_data, st->st_data.iov_base, transfer.rx_data_sz); }