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);
        }
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to